연습 1.3: 누수 후보 분석
시작하기 전에 연습 1.2: 힙 덤프 캡처를 완료해야 합니다.
이 연습에서는 먼저 누수될 것으로 보이는 객체의 목록(예:
배열, 벡터 및 세션)을 생성합니다.
이러한 객체가 "누수 후보"입니다. 그런 다음 목록을 분석하여 누수를 식별합니다.
누수 후보 목록 생성
목록을 생성하려면 다음을 수행하십시오.
- 누수 후보 보기의 지시사항에 따라 누수 분석 도구 모음 단추
를 누르십시오.
누수 분석 옵션 선택 대화 상자가 열립니다.
- 대화 상자에서 두 힙 덤프의 선택란이 선택되었는지 확인하십시오.
참고: 임계값은 기본적으로 20으로 설정됩니다. 이것은 가능성 값이
20 이상인 누수 후보만 표시된다는 의미입니다. (가능성 값에 대한 자세한
정보는 이 연습의 뒷부분에 있습니다.)
- 확인을 눌러 목록을 생성하십시오. Software Development Platform의 오른쪽
하단 모서리에 있는 표시기가 누수 후보를 찾는 중임을 알립니다.
누수 후보 보기 개요
프로세스가 완료되면 누수 후보 보기에 누수 후보의 목록이 표시됩니다.
각 후보마다 100 ~ 1의 가능성 값을 가지며 가능성이 가장 높은 후보의
값은 100입니다. 그에 따라 나머지 후보의 순위가 매겨지며 가능성의 내림차순으로
나열됩니다.
(힙 비교 알고리즘은 두 힙 덤프 간 간격 중에 누수의 크기와 증가에 따라 가능성
값을 계산합니다.)
이 프로파일링이 실행되는 임계값은 20으로 설정되었으며
가능성 값이 19 이하인 후보는 표시되지 않습니다.
보기에는 각 누수 후보에 대해 다음과 같은 데이터가 표시됩니다.
- 누수의 루트. 누수 가능성이 있는 객체의 참조를 보유하는 최상위 레벨 루트 객체입니다.
- 컨테이너 유형. 누수된 객체를 보유하는 콜렉션 객체입니다. 콜렉션 객체(예: 벡터 및
목록)에서 누수될 가능성이 가장 높습니다.
- 누수 내용. 누수된 객체의 유형입니다.
- 누수 갯수. 이 값은 컨테이너 객체에 있는 "누수 내용" 열에 지정된 유형의
객체 수를 나타냅니다. 이 객체는 다른 객체를 차례로 참조할 수 있습니다. 참조된 객체는 "누수된
객체"와 "누수된 바이트" 열에 포함됩니다.
- 누수된 바이트
- 누수된 객체
누수 분석 및 식별
누수를 식별하려면 다음을 수행하십시오.
- 누수 후보 보기에서 가능성이 100인 누수 후보의 데이터를
찾으십시오.
- 누수의 루트는 TestThreeTierQueue.<ObjectID>입니다.
- 컨테이너 유형은 vector입니다.
- 벡터는 누수되는 문자열입니다. 바꾸어 말하면, 벡터는 누수 갯수와 누수된 바이트 수에 따라
가비지 콜렉션이 메모리를 확보할 수 있도록 해제해야 할 문자열에 대한 참조를
보유합니다. (누수 갯수와 누수된 바이트 수는 이 프로그램을 실행할 때마다 캡처된 힙 덤프의 타이밍에 따라 다를 수 있습니다.)
- 누수 후보를 두 번 누르십시오. 객체 참조 그래프 보기가 열리고 누수 후보의
그래픽 데이터가 표시됩니다. (힙 덤프 표시를 준비하는 데 약간 시간이 걸릴 수 있습니다.)
- 객체 참조 그래프를 검사하십시오. 다음 사항에 주의하십시오.
-
그래프는 누수의 루트에서 SecondaryQueue, 벡터, 마지막으로 누수된 문자열 세트까지
참조별로 연결되어 누수 가능성이 있는 객체를 강조표시합니다. 이를 통해 누수 내용의
시각적 이미지가 제공됩니다.
- 그래프에는 Vector(누수와 관련된 컨테이너 유형)가 참조하는 Object
배열이 있으며 Object 배열은 누수되는 String 객체를 참조합니다.
- Object 배열과 String을 연결하는 경로 위에 커서를 일시정지하고
표시되는 툴팁을 읽으십시오. "계수"가 누수 후보 보기에 표시된 누수 갯수와 같게
표시되므로 누수로 식별된 문자열 콜렉션입니다.
- 2차 큐와 3차 큐는 모두 Object 배열에 대한 참조를 보유하지만 3차
큐는 누수 후보 보기에서 누수로 식별되지 않습니다. 그 이유는 다음과 같습니다.
- 실제로 3차 큐가 누수될 수 있지만 2차 큐보다 속도가 느립니다.
누수 분석을 기본값 20 미만의 임계값으로 다시 실행하면 3차 큐에 대한 누수가
표시될 수 있습니다.
- 3차 큐는 메모리가 누수되지 않고 유지되도록 [Object 배열
객체에 대한 참조를 보유하는 데 적합합니다. 2차 큐의 코드를 수정하고 개선된 어플리케이션을
다시 실행해 보면 그 이유를 알 수 있습니다.
- 객체 참조 그래프에서 String 객체를 두 번 누르십시오. 객체 세부사항
보기가 열립니다. String 객체에 대한 모든 세부사항(String 객체를 참조하는
모든 객체, 이 객체가 차례로 참조하는 모든 객체 포함)이 표시됩니다. 객체 세부사항
보기에서 레퍼러 중 하나를 눌러 레퍼러를 위로 탐색하거나 레퍼리(객체가 참조하는 객체) 중 하나를 눌러
레퍼리를 아래로 탐색할 수 있습니다.
2차 큐가 누수 객체이며 Vector 객체가 다수의
String 객체에 대한 참조를 보유하므로 누수된다는 점을
확인했습니다.
이제, 연습 1.4: 메모리 누수 해결을 시작할 준비가
되었습니다.