시냅스

JMX 와 VisualVM 그리고 Heap dump 분석하기 본문

Java, Spring

JMX 와 VisualVM 그리고 Heap dump 분석하기

ted k 2023. 2. 19. 14:54

출처 : IBM

JMX

  • jmx는 jdk 1.5 부터 포함된 Java 애플리케이션의 모니터링 관리를 위한 표준 API 이다.
  • 애플리케이션의 상태, 성능 및 리소스 사용 등과 같은 정보를 수집하고 이를 모니터링, 관리 및 제어하는 데 사용된다.
  • JMX MBean(Managed Bean) 이라는 개념을 사용하여 모니터링 및 관리할 수 있는 자원을 표현한다.
    • MBean 은 JMX 인프라스트럭처에 등록되며, 클라이언트는 MBean에 대한 요청을 보내어 정보를 얻거나 작업을 수행할 수 있다.
  • MBean
    • Standard MBean
      • 변경이 많지 않은 시스템을 관리하기 위한 MBean이 필요한 경우 사용
    • Dynamic MBean
      • 애플리케이션이 자주 변경되는 시스템을 관리하기 위한 MBean이 필요한 경우 사용
    • Model MBean
      • 어떤 리소스나 동적으로 설치가 가능한 MBean이 필요한 경우 사용
    • Open MBen
      • 실행 중에 발견되는 객체의 정보를 확인하기 위한 MBean이 필요할 때 사용
  • JMX의 3 계층
    • Instrumentation Layer
      • MBean 에 대한 자원을 랩핑할 수 있는 방법을 지시한다.
    • Agent Layer
      • 관리 인프라를 제공하는 에이전트와 MBean 서버로 구성된다.
      • 구현되는 서비스
        • 모니터링
        • 이벤트 알림
        • 타이머
    • Management Layer
      • 외부 관리 애플리케이션이 프로토콜, API 등의 측면에서 기본 계층과 상호작용할 수 있는 방법을 정의한다.

 

 

출처 : VisualVM

Visual VM

  • VisualVM은 JMX를 사용하여 자바 애플리케이션을 모니터링하고 분석하는 도구이다.
    • JMX는 VisualVM에서 API로 사용된다.
  • JDK에 포함된 도구로 GUI를 지원한다.
  • 다음과 같은 작업을 수행한다.
    • 시스템 및 JVM 모니터링
      • 시스템 및 JVM의 상태 및 성능 정보를 제공하며, 실행 중인 애플리케이션의 스레드, 클래스, 힙 및 스택 정보를 제공한다.
    • 메모리 프로파일링
      • 애플리케이션의 메모리 사용량, 객체 수명 및 할당 된 객체의 유형과 수를 분석한다.
    • 스레드 분석
      • 애플리케이션의 스레드 활동을 분석하여 블록 또는 대기 중인 스레드를 찾을 수 있다.
    • 힙 덤프 및 분석
      • 힙 덤프를 수집하고 메모리 누수 및 성능 문제를 분석할 수 있다.

 

Visual VM 사용 및 Heap Dump 분석

import java.util.ArrayList;
import java.util.List;

class SomeDto{
    private int a;

    public SomeDto(int a) {
        this.a = a;
    }
}

public class HeapDumpTest {
    public static void main(String[] args) {
        List<SomeDto> temp = new ArrayList<>();
        int cnt = 0;
        while (true) {
            // 프로세스가 너무 빨리 끝나는 걸 방지하기 위해
            if (System.currentTimeMillis() % 2 == 0) cnt += 1;
            if (cnt % 10 == 0) temp.add(new SomeDto(1));
        }
    }
}
  • 테스트로 사용할 코드이다.
  • 객체를 해제하지 못하게 참조하며 Out of Memory 를 유도한다.

 

  • Monitor 화면에서는 위와 같이 현재 프로세스에 대한 CPU, Heap, Classes, Threads 정보를 볼 수 있다.
  • 가끔 CPU 사용량이 100%가 되는 것을 볼 수 있는데, 이는 프로세스에서 메모리가 부족하여 OS에 메모리를 요청하면서 다시 GC를 실행하고, GC가 정상적으로 실행되지 않고 다시 메모리가 부족하여 OS에 메모리를 요청하고... 를 반복한 것으로 해석할 수 있다.

 

  • Visual VM 내 Visual GC 라는 플러그인을 통해서 GC에 대한 현황을 볼 수 있다.

 

  • 프로세스가 진행 중에 Monitoring 에서 Heap Dump 버튼을 클릭하면 실제 Heap Dump 가 생긴다.
  • 위에서 우리가 만들었던 SomeDto에 대한 정보들이 표시되는 것을 볼 수 있다.
Comments