힙 워커
힙 스냅샷
객체 간의 참조를 포함하는 모든 힙 분석은 힙 스냅샷이 필요합니다. JVM에 객체로의 들어오는 참조를 물어볼 수 없기 때문입니다. 해당 질문에 답하기 위해 전체 힙을 반복해야 합니다. 그 힙 스냅샷에서 JProfiler는 힙 워커의 뷰를 제공하는 데 필요한 데이터를 생성하는 내부 데이터베이스를 만듭니다.
힙 스냅샷의 두 가지 소스가 있습니다: JProfiler 힙 스냅샷과 HPROF/PHD 힙 스냅샷. JProfiler 힙 스냅샷은 힙 워커의 모든 사용 가능한 기능을 지원합니다. 프로파일링 에이전트는 프로파일링 인터페이스 JVMTI를 사용하여 모든 참조를 반복합니다. 프로파일된 JVM이 다른 머신에서 실행 중인 경우, 모든 정보는 로컬 머신으로 전송되고 추가 계산이 거기서 수행됩니다. HPROF/PHD 스냅샷은 JVM의 내장 메커니즘으로 생성되며 JProfiler가 읽을 수 있는 표준 형식으로 디스크에 기록됩니다. HotSpot JVM은 HPROF 스냅샷을 생성할 수 있으며 Eclipse OpenJ9 JVM은 PHD 스냅샷을 제공합니다.
힙 워커의 개요 페이지에서 JProfiler 힙 스냅샷 또는 HPROF/PHD 힙 스냅샷을 생성할지 선택할 수 있습니다. 기본적으로 JProfiler 힙 스냅샷이 권장됩니다. HPROF/PHD 힙 스냅샷은 다른 장에서 논의된 특별한 상황에서 유용합니다.
선택 단계
힙 워커는 선택된 객체 집합의 다양한 측면을 보여주는 여러 뷰로 구성됩니다. 힙 스냅샷을 찍은 직후, 힙의 모든 객체를 보고 있습니다. 각 뷰에는 선택된 객체를 현재 객체 집합으로 변환하는 탐색 작업이 있습니다. 힙 워커의 헤더 영역에는 현재 객체 집합에 포함된 객체 수에 대한 정보가 표시됩니다.
처음에는 라이브 메모리 섹션의 "모든 객체" 뷰와 유사한 "클래스" 뷰를 보고 있습니다. 클래스를 선택하고 사용→선택된 인스턴스를 호출하면 해당 클래스의 인스턴스만 포함하는 새로운 객체 집합이 생성됩니다. 힙 워커에서 "사용"은 항상 새로운 객체 집합을 생성하는 것을 의미합니다.
새로운 객체 집합의 경우, 힙 워커의 클래스 뷰를 보여주는 것은 흥미롭지 않을 것입니다. 왜냐하면 이전에 선택한 클래스로 테이블을 필터링하는 것과 같기 때문입니다. 대신 JProfiler는 "새로운 객체 집합" 대화 상자와 함께 다른 뷰를 제안합니다. 이 대화 상자를 취소하여 새로운 객체 집합을 버리고 이전 뷰로 돌아갈 수 있습니다. 나가는 참조 뷰가 제안되지만 다른 뷰를 선택할 수도 있습니다. 이것은 처음 표시된 뷰에만 해당되며, 이후 힙 워커의 뷰 선택기에서 뷰를 전환할 수 있습니다.
헤더 영역은 이제 두 개의 선택 단계가 있음을 알려주고, 현재 객체 집합에 의해 유지되는 모든 객체를 사용하기 위한 링크를 포함합니다. 후자는 또 다른 선택 단계를 추가하고 해당 객체 집합에 여러 클래스가 있을 가능성이 있기 때문에 클래스 뷰를 제안합니다.
힙 워커의 하단 부분에는 지금까지의 선택 단계가 나열됩니다. 하이퍼링크를 클릭하면 선택 단계로 돌아갈 수 있습니다. 첫 번째 데이터 집합은 도구 모음의 시작으로 이동 버튼으로도 접근할 수 있습니다. 도구 모음의 뒤로 및 앞으로 버튼은 분석에서 되돌아가야 할 때 유용합니다.
클래스 뷰
힙 워커 상단의 뷰 선택기에는 현재 객체 집합에 대한 다양한 정보를 보여주는 다섯 개의 뷰가 포함되어 있습니다. 그 중 첫 번째는 "클래스" 뷰입니다.
클래스 뷰는 라이브 메모리 섹션의 "모든 객체" 뷰와 유사하며, 클래스를 패키지로 그룹화할 수 있는 집계 수준 선택기가 있습니다. 또한 클래스에 대한 추정된 유지 크기를 표시할 수 있습니다. 이는 클래스의 모든 인스턴스가 힙에서 제거될 경우 해제될 메모리 양입니다. 추정된 유지 크기 계산 하이퍼링크를 클릭하면 새로운 유지 크기 열이 추가됩니다. 표시된 유지 크기는 추정된 하한이며, 정확한 숫자를 계산하는 것은 너무 느립니다. 정말로 정확한 숫자가 필요하다면, 관심 있는 클래스나 패키지를 선택하고 새로운 객체 집합의 헤더에 있는 유지 및 깊이 크기 계산 하이퍼링크를 사용하세요.
하나 이상의 클래스나 패키지를 선택한 후, 인스턴스 자체, 관련된 java.lang.Class
객체 또는 모든 유지 객체를 선택할 수 있습니다. 더블 클릭은 가장 빠른 선택
모드이며 선택된 인스턴스를 사용합니다. 여러 선택 모드가 가능한 경우, 이 경우처럼, 뷰 위에 사용 드롭다운 메뉴가 표시됩니다.
클래스 로더 관련 문제를 해결할 때, 인스턴스를 클래스 로더별로 그룹화해야 하는 경우가 많습니다. 검사 탭은 클래스 뷰에서 사용할 수 있는 "클래스 로더별 그룹화" 검사를 제공합니다. 이는 해당 컨텍스트에서 특히 중요하기 때문입니다. 해당 분석을 실행하면 상단에 모든 클래스 로더를 보여주는 그룹화 테이블이 표시됩니다. 클래스 로더를 선택하면 아래 뷰에서 데이터가 필터링됩니다. 그룹화 테이블은 다른 뷰로 전환할 때도 그대로 유지되며, 다른 선택 단계를 수행할 때까지 유지됩니다. 그런 다음 클래스 로더 선택이 해당 선택 단계의 일부가 됩니다.
할당 녹화 뷰
객체가 할당된 위치에 대한 정보는 메모리 누수의 용의자를 좁히거나 메모리 소비를 줄이려 할 때 중요할 수 있습니다. JProfiler 힙 스냅샷의 경우, "할당" 뷰는 할당 호출 트리와 할당 핫스팟을 보여줍니다. 할당이 기록된 객체에 대해 다른 객체는 할당 호출 트리의 "기록되지 않은 객체" 노드에 그룹화됩니다. HPROF/PHD 스냅샷의 경우, 이 뷰는 사용할 수 없습니다.
클래스 뷰와 마찬가지로, 여러 노드를 선택하고 상단의 선택된 사용 버튼을 사용하여 새로운 선택 단계를 만들 수 있습니다. "할당 핫스팟" 뷰 모드에서는 백 트레이스에서 노드를 선택할 수도 있습니다. 이는 선택된 백 트레이스로 끝나는 호출 스택에서 할당된 관련 최상위 핫스팟의 객체만 선택합니다.
JProfiler가 할당을 기록할 때 저장할 수 있는 또 다른 정보는 객체가 할당된 시간입니다. 힙 워커의 "시간" 뷰는 현재 객체 집합의 모든 기록된 인스턴스에 대한 할당 시간의 히스토그램을 보여줍니다. 하나 이상의 간격을 선택하고 선택된 사용 버튼으로 새로운 객체 집합을 만들 수 있습니다.
시간 간격을 더 정확하게 선택하려면 북마크 범위를 지정할 수 있습니다. 선택된 첫 번째 및 마지막 북마크 사이의 모든 객체가 표시됩니다.
시간 뷰 외에도 할당 시간은 참조 뷰에서 별도의 열로 표시됩니다. 그러나 할당 시간 기록은 기본적으로 활성화되어 있지 않습니다. 시간 뷰에서 직접 켜거나 세션 설정 대화 상자의 고급 설정 -> 메모리 프로파일링에서 설정을 편집할 수 있습니다.
가장 큰 객체 뷰
가장 큰 객체 뷰는 현재 객체 집합에서 가장 중요한 객체 목록을 보여줍니다. 이 컨텍스트에서 "가장 큰"은 힙에서 제거될 경우 가장 많은 메모리를 해제할 객체를 의미합니다. 그 크기는 유지 크기라고 합니다. 반면에 깊이 크기는 강한 참조를 통해 도달할 수 있는 모든 객체의 총 크기입니다.
각 객체는 이 객체에 의해 유지되는 다른 객체에 대한 나가는 참조를 보여주기 위해 확장할 수 있습니다. 이 방식으로, 조상 중 하나가 제거될 경우 가비지 수집될 유지 객체의 트리를 재귀적으로 확장할 수 있습니다. 이러한 종류의 트리를 "지배자 트리"라고 합니다. 이 트리의 각 객체에 대해 표시되는 정보는 나가는 참조 뷰와 유사하지만 지배 참조만 표시됩니다.
모든 지배된 객체가 지배자에 의해 직접 참조되는 것은 아닙니다. 예를 들어, 다음 그림의 참조를 고려해 보세요:
객체 A는 객체 B1과 B2를 지배하며, 객체 C에 대한 직접 참조가 없습니다. B1과 B2 모두 C를 참조합니다. B1이나 B2는 C를 지배하지 않지만 A는 지배합니다. 이 경우, B1, B2 및 C는 지배자 트리에서 A의 직접 자식으로 나열되며, C는 B1 및 B2의 자식으로 나열되지 않습니다. B1 및 B2의 경우, A에서 보유하고 있는 필드 이름이 표시됩니다. C의 경우, 참조 노드에 "[전이 참조]"가 표시됩니다.
지배자 트리의 각 참조 노드 왼쪽에는 상위 수준 객체의 유지 크기의 몇 퍼센트가 대상 객체에 의해 여전히 유지되고 있는지를 보여주는 크기 막대가 있습니다. 트리에서 더 깊이 들어갈수록 숫자가 감소합니다. 뷰 설정에서 퍼센트 기준을 전체 힙 크기로 변경할 수 있습니다.
지배자 트리는 유지 크기가 부모 객체의 유지 크기의 0.5% 미만인 모든 객체를 제거하는 내장 컷오프가 있습니다. 이는 중요한 객체에서 주의를 분산시키는 작은 지배 객체의 지나치게 긴 목록을 피하기 위함입니다. 이러한 컷오프가 발생하면, 이 수준에서 표시되지 않는 객체 수, 총 유지 크기 및 단일 객체의 최대 유지 크기에 대해 알리는 특별한 "컷오프" 자식 노드가 표시됩니다.
단일 객체를 표시하는 대신, 지배자 트리는 가장 큰 객체를 클래스별로 그룹화할 수도 있습니다. 뷰 상단의 그룹화 드롭다운에는 이 표시 모드를 활성화하는 체크박스가 포함되어 있습니다. 또한 최상위 수준에 클래스 로더 그룹화를 추가할 수 있습니다. 클래스 로더 그룹화는 가장 큰 객체가 계산된 후 적용되며, 가장 큰 객체의 클래스를 로드한 사람을 보여줍니다. 대신 특정 클래스 로더에 대한 가장 큰 객체를 분석하려면 먼저 "클래스 로더별 그룹화" 검사를 사용할 수 있습니다.
가장 큰 객체 뷰 위의 뷰 모드 선택기를 사용하여 선버스트 다이어그램으로 전환할 수 있습니다. 다이어그램은 일련의 동심원으로 구성되어 있으며, 최대 깊이까지 지배자 트리의 전체 내용을 하나의 이미지로 보여줍니다. 참조는 가장 안쪽의 링에서 시작하여 원의 바깥쪽 가장자리로 전파됩니다. 이 시각화는 높은 정보 밀도로 평평한 관점을 제공하여 참조 패턴을 발견하고 특별한 색상 코딩을 통해 큰 기본 및 객체 배열을 한눈에 볼 수 있습니다.
현재 객체 집합이 전체 힙인 경우, 원의 전체 둘레는 사용된 힙 크기에 해당합니다. 가장 큰 객체 뷰는 전체 힙의 0.1% 이상을 유지하는 객체만 표시하므로, 이는 상당한 섹터가 비어 있음을 의미하며, 이는 가장 큰 객체에 의해 유지되지 않는 모든 객체에 해당합니다.
링 세그먼트를 클릭하면 원의 새로운 루트를 설정하여 다이어그램에서 볼 수 있는 최대 깊이를 확장합니다. 다이어그램의 빈 중앙을 클릭하면 이전 루트가 복원됩니다. 새로운 루트가 설정된 경우, 원의 전체 둘레는 루트 객체의 유지 크기에 해당합니다. 빈 섹터는 루트 객체의 자체 크기와 가장 큰 유지 객체 목록에 없는 추가 객체를 나타냅니다. 현재 객체 집합이 전체 힙이 아닌 경우, 원의 전체 둘레는 표시된 가장 큰 객체의 합계에 해당하며 빈 섹터는 표시되지 않습니다.
다이어그램 위에 마우스를 올리면 인스턴스와 즉시 유지된 객체에 대한 추가 정보가 오른쪽에 표시됩니다. 마우스가 링 세그먼트 외부에 있을 때, 오른쪽의 목록은 가장 안쪽 링의 가장 큰 객체를 보여줍니다. 해당 목록 위에 마우스를 올리면 해당 링 세그먼트가 강조 표시되고, 목록 항목을 클릭하면 다이어그램의 새로운 루트가 설정됩니다. 새로운 객체 집합을 만들려면 링 세그먼트와 목록 항목 모두에서 컨텍스트 메뉴의 작업을 선택할 수 있습니다.
참조 뷰
이전 뷰와 달리, 참조 뷰는 최소한 하나의 선택 단계를 수행한 경우에만 사용할 수 있습니다. 초기 객체 집합의 경우, 이러한 뷰는 유용하지 않습니다. 왜냐하면 들어오는 및 나가는 참조 뷰는 모든 개별 객체를 보여주고, 병합된 참조 뷰는 집중된 객체 집합에 대해서만 해석할 수 있기 때문입니다.
나가는 참조 뷰는 IDE의 디버거가 보여줄 뷰와 유사합니다. 객체를 열면 기본 데이터와 다른 객체에 대한 참조를 볼 수 있습니다. 모든 참조 유형은 새로운 객체 집합으로 선택할 수 있으며, 여러 객체를
한 번에 선택할 수 있습니다. 클래스 뷰와 마찬가지로, 유지 객체 또는 관련된 java.lang.Class
객체를 선택할 수 있습니다. 선택된 객체가 표준 컬렉션인 경우, 단일
작업으로 모든 포함된 요소를 선택할 수도 있습니다. 클래스 로더 객체의 경우, 모든 로드된 인스턴스를 선택하는 옵션이 있습니다.
null 참조가 있는 필드는 기본적으로 표시되지 않습니다. 왜냐하면 해당 정보가 메모리 분석에 방해가 될 수 있기 때문입니다. 디버깅 목적으로 모든 필드를 보고 싶다면, 뷰 설정에서 이 동작을 변경할 수 있습니다.
표시된 인스턴스의 간단한 선택 외에도, 나가는 참조 뷰에는 강력한 필터링 기능이 있습니다. 라이브 세션의 경우, 나가는 참조 뷰와 들어오는 참조 뷰 모두 동일한 장에서 논의된 고급 조작 및 표시 기능을 가지고 있습니다.
들어오는 참조 뷰는 메모리 누수를 해결하기 위한 주요 도구입니다. 객체가 가비지 수집되지 않는 이유를 찾으려면, GC 루트로의 경로 표시 버튼이 가비지 수집기 루트로의 참조 체인을 찾습니다. 메모리 누수에 대한 장에는 이 중요한 주제에 대한 자세한 정보가 있습니다.
병합된 참조
많은 다른 객체에 대한 참조를 확인하는 것은 번거로울 수 있으므로, JProfiler는 현재 객체 집합의 모든 객체에 대한 병합된 나가는 및 들어오는 참조를 보여줄 수 있습니다. 기본적으로 참조는
클래스별로 집계됩니다. 클래스의 인스턴스가 동일한 클래스의 다른 인스턴스에 의해 참조되는 경우,
필드별로 그룹화된 병합된 참조를 표시하도록 선택할 수도 있습니다. 이 경우, 각 노드는 클래스의 특정 필드나 배열의 내용과 같은 참조 유형입니다. 표준 컬렉션의 경우, 누적을 방해할 내부 참조 체인이 압축되어 "java.lang.HashMap의 맵 값"과 같은 참조 유형을 볼 수 있습니다. 클래스 집계의 경우와 달리, 이 메커니즘은 JRE의 표준 라이브러리에서 명시적으로 지원되는 컬렉션에만 작동합니다.
"병합된 나가는 참조" 뷰에서 인스턴스 수는 참조된 객체를 나타냅니다. "병합된 들어오는 참조" 뷰에서는 각 행에 두 개의 인스턴스 수가 표시됩니다. 첫 번째 인스턴스 수는 현재 객체 집합에서 이 경로를 따라 참조된 인스턴스 수를 보여줍니다. 노드 왼쪽의 막대 아이콘은 이 비율을 시각화합니다. 화살표 아이콘 뒤의 두 번째 인스턴스 수는 상위 노드에 대한 참조를 보유한 객체를 나타냅니다. 선택 단계를 수행할 때, 선택된 방식으로 참조된 현재 객체 집합의 객체를 선택할지, 선택된 참조를 가진 객체(참조 보유자)에 관심이 있는지를 선택할 수 있습니다.
"병합된 지배 참조" 뷰를 사용하면 현재 객체 집합의 일부 또는 전체 객체가 가비지 수집될 수 있도록 제거해야 하는 참조를 찾을 수 있습니다. 지배 참조 트리는 가장 큰 객체 뷰의 지배자 트리의 병합된 역으로 해석될 수 있으며, 클래스별로 집계됩니다. 참조 화살표는 두 클래스 간의 직접 참조를 나타내지 않을 수 있지만, 지배하지 않는 참조를 보유한 다른 클래스가 있을 수 있습니다. 여러 가비지 수집기 루트의 경우, 현재 객체 집합의 일부 또는 전체 객체에 대해 지배 참조가 존재하지 않을 수 있습니다.
기본적으로 "병합된 지배 참조" 뷰는 들어오는 지배 참조를 보여주며, 트리를 열면 GC 루트에 의해 보유된 객체에 도달할 수 있습니다. 때로는 참조 트리가 여러 다른 경로를 따라 동일한 루트 객체로 이어질 수 있습니다. 뷰 상단의 드롭다운에서 "GC 루트에서 객체로" 뷰 모드를 선택하면, 루트가 최상위 수준에 있고 현재 객체 집합의 객체가 리프 노드에 있는 반대 관점을 볼 수 있습니다. 이 경우, 참조는 최상위 수준에서 리프 노드로 향합니다. 어느 관점이 더 나은지는 제거하려는 참조가 현재 객체 집합에 가까운지, GC 루트에 가까운지에 따라 다릅니다.
검사
"검사" 뷰는 자체적으로 데이터를 표시하지 않습니다. 다른 뷰에서 사용할 수 없는 규칙에 따라 새로운 객체 집합을 생성하는 여러 힙 분석을 제공합니다. 예를 들어, 스레드 로컬에 의해 유지되는 모든 객체를 보고 싶을 수 있습니다. 이는 참조 뷰에서 수행할 수 없습니다. 검사는 여러 범주로 그룹화되어 있으며 설명에서 설명됩니다.
검사는 계산된 객체 집합을 그룹으로 분할할 수 있습니다. 그룹은 힙 워커 상단의 테이블에 표시됩니다. 예를 들어, "중복 문자열" 검사는 중복된 문자열 값을 그룹으로 표시합니다. 참조 뷰에 있는 경우,
선택된 문자열 값으로 java.lang.String
인스턴스를 볼 수 있습니다. 처음에는 그룹 테이블의 첫 번째 행이 선택됩니다. 선택을 변경하면 현재 객체 집합이 변경됩니다.
그룹 테이블의 인스턴스 수 및 크기 열은 행을 선택할 때 현재 객체 집합이 얼마나 큰지를 알려줍니다.
그룹 선택은 힙 워커에서 별도의 선택 단계가 아니지만, 검사가 수행한 선택 단계의 일부가 됩니다. 선택 단계를 변경하면 선택 단계 창이 즉시 업데이트됩니다.
그룹을 생성하는 각 검사는 검사 컨텍스트에서 가장 중요한 그룹을 결정합니다. 이는 항상 다른 열의 자연 정렬 순서와 일치하지 않기 때문에, 그룹 테이블의 우선순위 열에는 검사를 위한 정렬 순서를 강제하는 숫자 값이 포함되어 있습니다.
검사는 큰 힙에 대해 계산하기에 비용이 많이 들 수 있으므로 결과는 캐시됩니다. 이렇게 하면, 기록에서 돌아가 이전에 계산된 검사의 결과를 기다리지 않고 볼 수 있습니다.
힙 워커 그래프
인스턴스와 그 참조를 함께 가장 현실적으로 표현하는 것은 그래프입니다. 그래프는 시각적 밀도가 낮고 일부 유형의 분석에는 비실용적일 수 있지만, 여전히 객체 간의 관계를 시각화하는 가장 좋은 방법입니다. 예를 들어, 순환 참조는 트리에서 해석하기 어렵지만 그래프에서는 즉시 명백합니다. 또한, 나가는 참조와 들어오는 참조를 함께 보는 것이 유익할 수 있습니다. 이는 트리 구조에서는 하나 또는 다른 것만 볼 수 있기 때문에 불가능합니다.
힙 워커 그래프는 현재 객체 집합의 객체를 자동으로 표시하지 않으며, 현재 객체 집합을 변경할 때 지워지지 않습니다. 나가는 참조 뷰, 들어오는 참조 뷰 또는 가장 큰 객체 뷰에서 선택한 객체를 수동으로 그래프에 추가하여 하나 이상의 인스턴스를 선택하고 그래프에 표시 작업을 사용합니다.
그래프의 패키지 이름은 기본적으로 축약됩니다. CPU 호출 그래프와 마찬가지로, 뷰 설정에서 전체 표시를 활성화할 수 있습니다. 참조는 화살표로 그려집니다. 참조 위에 마우스를 올리면 특정 참조에 대한 세부 정보를 보여주는 툴팁 창이 표시됩니다. 참조 뷰에서 수동으로 추가된 인스턴스는 파란색 배경을 가지고 있습니다. 인스턴스가 더 최근에 추가될수록 배경 색상이 더 어두워집니다. 가비지 수집기 루트는 빨간색 배경을 가지고 있으며 클래스는 노란색 배경을 가지고 있습니다.
기본적으로 참조 그래프는 현재 인스턴스의 직접적인 들어오는 및 나가는 참조만 표시합니다. 객체를 더블 클릭하여 그래프를 확장할 수 있습니다. 이는 해당 객체에 대한 직접적인 들어오는 참조 또는 직접적인 나가는 참조를 확장합니다. 인스턴스의 왼쪽 및 오른쪽에 있는 확장 컨트롤을 사용하여 들어오는 및 나가는 참조를 선택적으로 열 수 있습니다. 되돌아가야 할 경우, 그래프의 이전 상태를 복원하기 위해 실행 취소 기능을 사용하여 너무 많은 노드에 의해 방해받지 않도록 하세요. 그래프를 다듬기 위해 모든 연결되지 않은 노드를 제거하거나 모든 객체를 제거하는 작업이 있습니다.
들어오는 참조 뷰와 마찬가지로, 그래프에는 GC 루트로의 경로 표시 버튼이 있어 가비지 수집기 루트로의 참조 체인을 확장합니다. 또한, 두 인스턴스가 선택된 경우 활성화되는 두 선택된 노드 간의 경로 찾기 작업이 있습니다. 이는 약한 참조를 따라가는 경로를 검색할 수 있습니다. 적절한 경로가 발견되면 빨간색으로 표시됩니다.
초기 객체 집합
힙 스냅샷을 찍을 때, 초기 객체 집합을 제어하는 옵션을 지정할 수 있습니다. 할당을 기록한 경우, 기록된 객체 선택 체크박스는 초기 표시 객체를 기록된 객체로 제한합니다. 힙 워커에 의해 참조되지 않은 객체가 제거되기 때문에, 숫자는 일반적으로 라이브 메모리 뷰의 숫자와 다릅니다. 기록되지 않은 객체는 여전히 힙 스냅샷에 존재하지만, 초기 객체 집합에는 표시되지 않습니다. 추가 선택 단계를 통해 기록되지 않은 객체에 도달할 수 있습니다.
또한, 힙 워커는 가비지 수집을 수행하고 약하게 참조된 객체를 제거합니다. 단, 소프트 참조는 제외됩니다. 이는 약하게 참조된 객체가 메모리 누수를 찾을 때 방해가 될 수 있기 때문에 일반적으로 바람직합니다. 약하게 참조된 객체에 관심이 있는 경우, 힙 워커에 해당 객체를 유지하도록 지시할 수 있습니다. JVM의 네 가지 약한 참조 유형은 "소프트", "약한", "팬텀" 및 "파이널라이저"이며, 힙 스냅샷에서 객체를 유지하기에 충분한 참조 유형을 선택할 수 있습니다.
약하게 참조된 객체가 있는 경우, 힙 워커의 "약한 참조" 검사를 사용하여 현재 객체 집합에서 선택하거나 제거할 수 있습니다.
힙 마킹
종종 특정 사용 사례를 위해 할당된 객체를 보고 싶을 때가 있습니다. 할당 기록을 해당 사용 사례 주변에서 시작하고 중지하여 이를 수행할 수 있지만, 오버헤드가 훨씬 적고 다른 용도로 할당 기록 기능을 보존하는 훨씬 더 나은 방법이 있습니다: 힙 워커 개요에서 광고되고 프로파일링 메뉴 또는 트리거 작업으로도 사용할 수 있는 힙 마크 작업은 힙의 모든 객체를 "오래된" 것으로 표시합니다. 다음 힙 스냅샷을 찍을 때, 이제 "새로운" 객체가 무엇인지 명확합니다.
이전 힙 스냅샷이나 힙 마크 호출이 있었던 경우, 힙 워커의 제목 영역에는 새로운 인스턴스 수와 새로운 사용 및 오래된 사용이라는 두 개의 링크가 표시되어, 해당 시점 이후에 할당된 인스턴스 또는 이전에 할당된 생존 인스턴스를 선택할 수 있습니다. 이 정보는 각 객체 집합에 대해 제공되므로, 먼저 드릴다운하고 나중에 새로운 또는 오래된 인스턴스를 선택할 수 있습니다.