가비지 컬렉터 분석
가비지 컬렉터(GC)의 런타임 특성을 이해하고 분석하는 것은 여러 가지 이유로 중요합니다. 첫째, GC 일시 중지는 애플리케이션의 응답성에 직접적인 영향을 줄 수 있습니다. 가비지 컬렉터가 어떻게 작동하는지 이해함으로써 이러한 일시 중지를 줄이기 위해 설정을 최적화할 수 있습니다. 일반적으로, 빈번하고 긴 GC 사이클은 힙이 너무 작거나 너무 많은 임시 객체가 생성되고 있음을 나타낼 수 있습니다.
가비지 컬렉터 프로브의 도움으로 이러한 문제를 해결하고 JVM 설정을 조정할 때 더 나은 결정을 내릴 수 있습니다. 예를 들어 적절한 가비지 컬렉터, 힙 크기 또는 기타 JVM 매개변수를 선택할 수 있습니다.
가비지 컬렉터 프로브는 다른 프로브와 다른 뷰를 가지고 있으며, 다른 데이터 소스를 사용합니다. JVM의 프로파일링 인터페이스에서 데이터를 얻지 않고 JFR 스트리밍을 사용하여 JDK 플라이트 레코더의 GC 관련 이벤트를 분석합니다. JFR 이벤트 스트리밍에 의존하기 때문에, GC 프로브는 Java 17 이상에서 Hotspot JVM을 프로파일할 때만 사용할 수 있습니다. JFR 스냅샷을 열 때, 사용된 Java 버전에 관계없이 동일한 프로브를 사용할 수 있습니다.
가비지 컬렉션 뷰
가비지 컬렉터 프로브의 주요 뷰는 "가비지 컬렉션" 테이블입니다. 이 테이블은 모든 기록된 가비지 컬렉션을 행으로 표시하며, 가장 중요한 메트릭을 열로 표시합니다.
"원인" 열은 가비지 컬렉션이 트리거된 이유를 보여줍니다. 예를 들어, System.gc()
호출은 전체 가비지 컬렉션을 트리거했습니다. 이는 "수집기" 열의 "G1Full"
값에서 확인할 수 있습니다. 또한 20ms의 상당한 일시 중지를 유발했기 때문에 일반적으로 System.gc()
를 호출하는 것은 좋은 생각이 아닙니다. 다른 원인은 젊은 세대
공간("G1New")의 수집을 트리거하거나, 오래된 세대의 참조되지 않은 객체를 정리하는 G1 수집기의 오래된 GC 수집("G1Old")을 트리거합니다. 오래된 GC 수집은 젊은 세대 수집보다 시간이 더
오래 걸리지만, 젊은 세대 수집은 더 많은 객체를 수집합니다.
특별한 GC 처리가 있는 수집된 참조는 "final", "weak", "soft" 및 "phantom" 참조로 별도의 열에 표시됩니다.
가장 긴 일시 중지와 일시 중지 합계에 대해 별도의 열이 있는 이유는 각 가비지 컬렉션이 여러 단계로 구성되어 별도의 일시 중지를 생성하기 때문입니다. 또한, 가비지 컬렉션의 "지속 시간"은 일시 중지 합계와 같지 않습니다. 가비지 컬렉션은 실행 중에 JVM을 부분적으로만 일시 중지하기 때문입니다. 스크린샷에서 "G1Old" 컬렉션은 지속 시간의 약 5분의 1만큼만 일시 중지됩니다.
가비지 컬렉션의 다양한 단계를 검사하려면 "GC ID" 열의 트리 아이콘을 전환할 수 있습니다.
위의 스크린샷에서는 G1 수집기의 혼합 GC 수집("G1Old")이 확장되었습니다. 대부분의 시간이 "클래스 언로딩"에 소비되며, 이는 JVM을 일시 중지하지 않습니다. 오른쪽에서는 가비지 컬렉션에 대한 추가 통계를 볼 수 있습니다. 여기서 사용된 힙은 동일하게 유지되었지만 사용된 메타스페이스는 0.1% 증가했습니다.
각 수집기의 단계는 다릅니다. 위의 스크린샷에서는 전체 수집이 표시됩니다. 전체 힙에서 살아있는 객체를 마킹하는 데 많은 시간이 소요됩니다. 수집이 끝날 때, 사용된 힙은 15.7% 감소했으며, 메타스페이스는 동일하게 유지되었습니다.
가비지 컬렉션을 분석할 때, 필터링은 다양한 가비지 컬렉션의 하위 집합을 비교하는 중요한 도구입니다. 테이블 상단에는 필터 선택기가 있어 원하는 열을 선택하고 해당 필터를 구성할 수 있습니다. 유사한 가비지 컬렉션을 쉽게 확인하려면 테이블의 컨텍스트 메뉴를 사용하여 선택한 행의 열 값에 기반한 필터 조건을 선택할 수 있습니다.
관심 있는 가비지 컬렉션을 좁히기 위해 여러 필터를 추가할 수 있습니다. 활성 필터는 테이블 상단에 레이블로 표시됩니다. 중첩된 GC 단계 테이블에서도 필터를 추가할 수 있습니다.
텔레메트리
GC 프로브는 "텔레메트리" 프로브 뷰에서 사용할 수 있는 여러 텔레메트리를 생성합니다.
GC 일시 중지를 최소화하는 데 관심이 있다면, 상단의 "가장 긴 일시 중지" 텔레메트리가 가장 흥미로울 것입니다. 텔레메트리의 시간 축을 따라 드래그하여 "가비지 컬렉션" 뷰에서 해당 가비지 컬렉션을 선택할 수 있습니다. 더 나은 수직 해상도를 위해 상단의 드롭다운에서 단일 텔레메트리를 선택하거나 텔레메트리 이름을 클릭하여 선택할 수 있습니다.
위의 스크린샷에서는 시간에 따른 일시 중지 합계를 볼 수 있습니다. JProfiler는 기록된 데이터의 히스토그램을 구축하여 합산 가능한 측정을 제공합니다. 빈 너비는 사용 가능한 수평 공간에 따라 달라지므로, 히스토그램 빈은 확대/축소 수준에 따라, 그리고 "맞춤 비율"이 활성화된 경우 창의 너비에 따라 변경됩니다. 동일하게 유지되는 것은 모든 히스토그램 빈 아래의 총 면적입니다.
힙 및 메타스페이스 텔레메트리는 가비지 컬렉션을 확장할 때 볼 수 있는 통계에 기반합니다. 이는 전체 프로파일링 세션의 메모리 텔레메트리와 같이 정기적으로 샘플링되지 않습니다. 특정 기간 동안 가비지 컬렉션이 발생하지 않으면 데이터가 없습니다. 할당 활동이 적은 JVM의 경우, 그래프가 두 가비지 컬렉션 사이에서 단순히 보간되는 시간 축을 따라 긴 구간이 있을 수 있습니다.
이러한 각 텔레메트리는 "GC 전" 및 "GC 후"의 두 데이터 라인을 가지고 있습니다. 차이는 일반적으로 "사용된 힙" 텔레메트리에서 큽니다. 각 시간에 가비지 컬렉션이 수행한 작업량을 두 데이터 라인의 값을 비교하여 확인할 수 있습니다. 툴팁을 보면 정확한 값을 확인할 수 있습니다. "커밋된 힙" 텔레메트리와 메타스페이스 텔레메트리의 경우, 두 라인 간의 차이는 종종 작습니다.
JFR 스냅샷을 분석하는 경우, 동일한 데이터가 "메모리" 텔레메트리에서
jdk.GCHeapSummary
JFR 이벤트 유형으로 사용됩니다. 그러나 이 경우, "GC 전" 및 "GC 후" 값이 동일한 데이터 라인에 표시되며, GC 프로브 텔레메트리와
같이 초당 한 번의 집계로 데이터가 집계되지 않으므로 그래프가 다르게 보일 것입니다.
GC 요약
GC 요약은 전체 녹화 기간 동안 집계된 측정을 보여줍니다. 각 측정은 가비지 컬렉션의 수와 평균, 최대 및 총 값을 제공합니다. 상단의 가장 중요한 데이터는 애플리케이션의 활성도에 직접 영향을 미치는 "일시 중지 시간"입니다.
다른 최상위 카테고리는 모든 컬렉션의 총 시간을 보여주며, 이는 젊은 컬렉션과 오래된 컬렉션의 두 하위 카테고리로 나뉩니다.
GC 구성
가비지 컬렉터를 조정할 때, 명시적으로 설정할 수 있거나 가비지 컬렉터 자체에 의해 암시적으로 설정된 일반 속성을 검사하고 싶을 수 있습니다.
이러한 속성은 모든 가비지 컬렉터에 공통적이며, 가비지 컬렉터 간의 차이를 이해하는 데 도움이 됩니다.
GC 플래그
마지막으로, GC 전용 플래그는 가비지 컬렉터의 어떤 속성을 조정할 수 있는지에 대한 아이디어를 제공하며, 실제 값을 확인할 수 있습니다.
"원본" 열은 플래그가 어떻게 설정되었는지를 보여줍니다. "기본값"은 표준 설정에서 수정되지 않은 값을 나타내며, "인체공학적" 플래그는 가비지 컬렉터에 의해 자동으로 조정된 값을 나타냅니다. 명령줄에서 특정 GC 플래그를 설정한 경우, 원본에서 "명령줄"로 보고됩니다.