garbage collector(GC)의 런타임 특성을 이해하고 분석하는 것은 여러 가지 이유로 중요합니다. 먼저, GC pause는 애플리케이션의 응답성에 직접적인 영향을 줄 수 있습니다. garbage collector의 동작 방식을 이해하면 이러한 pause를 줄이기 위해 설정을 최적화할 수 있습니다. 일반적으로, 빈번하고 긴 GC 사이클은 heap이 너무 작거나, 임시 객체가 너무 많이 생성되고 있음을 나타낼 수 있습니다.
garbage collector 프로브를 활용하면 이러한 문제를 해결하고, JVM 설정을 튜닝할 때(예: 적절한 garbage collector 선택, heap 크기, 기타 JVM 파라미터 등) 더 나은 결정을 내릴 수 있습니다.
garbage collector 프로브는 다른 프로브들과는 다른 뷰를 제공하며, 데이터 소스도 다릅니다. 이 프로브는 JVM의 프로파일링 인터페이스에서 데이터를 가져오는 것이 아니라, JFR 스트리밍을 사용하여 JDK flight recorder의 GC 관련 이벤트를 분석합니다. JFR 이벤트 스트리밍에 의존하기 때문에, GC 프로브는 Java 17 이상이 실행되는 HotSpot JVM에서만 사용할 수 있습니다. JFR 스냅샷을 열 때는 Java 버전에 상관없이 동일한 프로브를 사용할 수 있습니다.
Garbage collections 뷰
garbage collector 프로브의 주요 뷰는 "Garbage collections" 테이블입니다. 이 테이블은 모든 기록된 garbage collection을 행(row)으로, 가장 중요한 메트릭을 열(column)로 보여줍니다.
"Cause" 열에서는 garbage collection이 트리거된 원인을 확인할 수 있습니다. 예를 들어,
System.gc() 호출로 인해 전체 garbage collection이 트리거될 수 있습니다. 이 경우 "Collector" 열의 "G1Full" 값에서 확인할 수 있습니다.
또한 20ms의 상당한 pause가 발생했기 때문에, 일반적으로 System.gc() 호출은 권장되지 않습니다. 그 외의 원인으로는 young generation 공간의
수집("G1New")이나, G1 collector의 old GC collection("G1Old")이 있습니다. old GC collection은 old generation에서 참조되지 않는 객체를
정리합니다. 스크린샷에서 볼 수 있듯이, old GC collection은 young generation collection보다 일관되게 더 오래 걸리지만, young generation
collection이 더 많은 객체를 수집합니다.
특별한 GC 처리가 적용된 수집된 참조는 별도의 열에 "final", "weak", "soft", "phantom" 참조로 표시됩니다.
가장 긴 pause와 pause의 합계에 대해 별도의 열이 있는 이유는, 각 garbage collection이 여러 단계로 구성되어 각각 별도의 pause를 발생시키기 때문입니다. 또한, garbage collection의 "Duration"은 pause의 합계와 같지 않습니다. garbage collection은 실행 중에 JVM을 부분적으로만 pause시키기 때문입니다. 스크린샷의 "G1Old" collection은 duration의 약 1/5만큼만 pause가 발생하는 것을 볼 수 있습니다.
garbage collection의 다양한 단계를 확인하려면 "GC ID" 열의 트리 아이콘을 토글할 수 있습니다.
위 스크린샷에서는 G1 collector의 mixed GC collection("G1Old")이 확장되어 있습니다. 대부분의 시간이 "Class Unloading"에 소비되며, 이 단계는 JVM을 pause시키지 않습니다. 오른쪽에서는 garbage collection에 대한 추가 통계를 볼 수 있습니다. 여기서는 사용된 heap은 동일하게 유지되었고, 사용된 metaspace는 0.1% 증가했습니다.
각 collector의 단계는 다릅니다. 위 스크린샷에서는 전체(full) collection이 표시되어 있습니다. 전체 heap에서 live 객체를 마킹하는 데 많은 시간이 소요됩니다. collection이 끝나면, 사용된 heap이 15.7% 감소했고, metaspace는 동일하게 유지되었습니다.
garbage collection을 분석할 때 필터링은 서로 다른 garbage collection의 하위 집합을 비교하는 데 중요한 도구입니다. 테이블 상단에는 필터 선택기가 있어, 원하는 열을 선택하고 해당 필터를 설정할 수 있습니다. 비슷한 garbage collection을 더 쉽게 확인하려면, 테이블의 컨텍스트 메뉴에서 선택한 행의 열 값에 기반한 필터 조건을 선택할 수 있습니다.
여러 개의 필터를 추가하여 관심 있는 garbage collection을 좁힐 수 있습니다. 활성화된 필터는 테이블 상단에 라벨로 표시됩니다. 중첩된 GC 단계 테이블에서도 필터를 추가할 수 있습니다.
텔레메트리
GC 프로브는 "텔레메트리" 프로브 뷰에서 확인할 수 있는 여러 개의 텔레메트리를 생성합니다.
GC pause를 최소화하는 데 관심이 있다면, 상단의 "Longest pause" 텔레메트리가 가장 유용할 것입니다. 텔레메트리의 시간 축을 드래그하여 "Garbage Collections" 뷰에서 해당 garbage collection을 선택할 수 있습니다. 더 나은 세로 해상도를 위해, 상단의 드롭다운이나 텔레메트리 이름을 클릭하여 단일 텔레메트리를 선택할 수 있습니다.
위 스크린샷에서는 시간에 따른 pause의 합계를 볼 수 있습니다. JProfiler는 합산 가능한 측정값을 기록된 데이터의 히스토그램으로 제공합니다. bin의 너비는 사용 가능한 가로 공간에 따라 달라지므로, 히스토그램 bin은 zoom 수준이나 "scale to fit"이 활성화된 경우 창의 너비에 따라 달라집니다. 변하지 않는 것은 모든 히스토그램 bin 아래의 전체 면적입니다.
heap 및 metaspace 텔레메트리는 garbage collection을 확장할 때 볼 수 있는 통계에 기반합니다. 즉, 이 데이터는 전체 프로파일링 세션의 메모리 텔레메트리처럼 정기적으로 샘플링되지 않습니다. 특정 기간 동안 garbage collection이 발생하지 않으면 데이터가 없습니다. 할당 활동이 적은 JVM의 경우, 두 garbage collection 사이의 시간 축에 따라 그래프가 길게 보간될 수 있습니다.
각 텔레메트리에는 "Before GC"와 "After GC" 두 개의 데이터 라인이 있습니다. "Used Heap" 텔레메트리에서는 두 값의 차이가 일반적으로 큽니다. 각 시점에서 두 데이터 라인의 값을 비교하여 garbage collection이 얼마나 많은 작업을 수행했는지 확인할 수 있습니다. 툴팁을 보면 정확한 값을 알 수 있습니다. "Committed heap" 텔레메트리와 metaspace 텔레메트리에서는 두 라인 간의 차이가 작을 때가 많습니다.
JFR 스냅샷을 분석하는 경우, jdk.GCHeapSummary JFR 이벤트 타입의 동일한 데이터가
텔레메트리 섹션의 "Memory" 텔레메트리에도 사용됩니다.
이 경우에는 "Before GC"와 "After GC" 값이 동일한 데이터 라인에 표시되고, GC 프로브 텔레메트리처럼 1초 단위로 집계되지 않으므로 그래프가 다르게 보일 수 있습니다.
GC 요약
GC 요약에서는 전체 녹화 기간 동안 집계된 측정값을 보여줍니다. 각 측정값에는 garbage collection 횟수, 평균, 최대, 전체 값이 제공됩니다. 상단의 가장 중요한 데이터는 애플리케이션의 활성도에 직접적으로 영향을 주는 "Pause times"입니다.
다른 최상위 카테고리에서는 모든 collection의 전체 시간이 표시되며, 이는 young collection과 old collection의 두 하위 카테고리로 분할됩니다.
GC 설정
garbage collector를 튜닝할 때, 명시적으로 설정하거나 garbage collector가 내부적으로 설정하는 공통 속성을 확인하고 싶을 수 있습니다.
이러한 속성은 모든 garbage collector에 공통적으로 적용되며, garbage collector 간의 차이를 이해하는 데 도움이 됩니다.
GC 플래그
마지막으로, GC 전용 플래그를 통해 garbage collector의 어떤 속성을 튜닝할 수 있는지 확인하고, 실제 값을 점검할 수 있습니다.
"Origin" 열에서는 해당 플래그가 어떻게 설정되었는지 보여줍니다. "Default" 값은 표준 설정에서 변경되지 않은 값이고, "Ergonomic" 플래그는 garbage collector가 자동으로 조정한 값입니다. 명령줄에서 특정 GC 플래그를 설정한 경우, origin에 "Command line"으로 표시됩니다.



















