HPROF 프로파일러 사용

HPROF 는 JVMTI를 사용하여 Java™ 실행에 대한 정보를 수집하고 기록하는 IBM® SDK와 함께 제공되는 데모 프로파일러입니다. HPROF를 사용하여 메모리나 프로세서 시간을 가장 많이 사용하는 프로그램의 파트를 알아낼 수 있습니다.

애플리케이션의 효율성을 향상시키려면 많은 양의 메모리와 프로세서 자원을 사용하는 파트가 코드의 어느 부분인지 알아야 합니다. HPROF는 예제 JVMTI 에이전트로 다음과 같은 구문으로 시작됩니다.
java -Xrunhprof[:<option>=<value>,...] <classname>

HPROF를 사용하여 Java를 실행하면 프로그램이 종료될 때 파일이 작성됩니다. 이 파일은 현재 작업 중인 디렉토리에 있으며 다른 파일 이름이 주어지지 않는 한 java.hprof.txt(2진 형식인 경우 java.hprof)로 이름이 지정됩니다. 이 파일에는 몇 개의 다양한 섹션이 포함되지만 정확한 형식 및 컨텐츠는 선택한 옵션에 따라 다릅니다.

이 절에 포함된 것보다 많은 HPROF에 대한 자세한 정보가 필요한 경우 https://docs.oracle.com/javase/8/docs/technotes/samples/hprof.html의 내용을 참조하십시오.

java -Xrunhprof:help 명령은 사용 가능한 옵션을 표시합니다.

heap=dump|sites|all
이 옵션은 메모리 사용량을 분석하는 데 도움이 됩니다. 이 옵션은 HPROF에서 스택 추적을 생성하게 하고 이를 통해 메모리가 할당된 위치를 알 수 있습니다. heap=dump 옵션을 사용하면 힙에 있는 모든 활성 오브젝트에 대한 덤프를 얻습니다. heap=sites를 사용하면 시작 시 가장 많이 할당된 오브젝트가 있는 정렬된 사이트 목록을 얻습니다. 기본값인 all은 두 유형의 출력을 모두 제공합니다.
cpu=samples|times|old
cpu 옵션은 프로세서가 대부분의 시간을 보내는 위치를 판단하는 데 유용한 정보를 제공합니다. cpusamples로 설정되면 JVM이 실행을 일시정지하고 활성인 메소드 호출을 식별합니다. 충분한 비율로 샘플링을 수행하면 프로그램이 대부분 시간을 어디에서 소비하는지 알게 됩니다. cputimes로 설정되면 각 메소드가 호출된 정확한 횟수와 각 실행 시 소요된 시간을 알 수 있습니다. 이 옵션은 정확도는 높으나 프로그램 속도를 저하시킵니다. cpuold로 설정되면 프로파일링 데이터가 이전 HPROF 형식으로 생성됩니다.
interval=y|n
간격 옵션은 cpu=samples에만 적용되며 스레드 트랙의 샘플 간에 샘플링 스레드가 휴면 상태로 유지되는 시간을 제어합니다.
monitor=y|n
monitor 옵션은 동기화가 사용자 애플리케이션에 영향을 주는 방법을 이해하는 데 도움이 됩니다. 모니터는 스레드 동기화를 구현합니다. 모니터에 대한 정보가 있으면 다양한 스레드가 이미 잠김 상태인 자원에 액세스를 시도할 때 얼마만큼의 시간을 소비하는지 알 수 있습니다. HPROF는 또한 사용 중인 모니터에 대한 스냅샷을 제공합니다. 이 정보는 교착 상태를 발견하는 데 유용합니다.
format=a|b
출력 파일의 기본값은 ASCII 형식입니다. 힙 분석 도구와 같은 일부 유틸리티에서 필요한 2진 형식을 지정하려는 경우, format을 'b'로 설정하십시오.
file=<filename>
출력 파일의 이름을 변경하려면 file 옵션을 사용하십시오. ASCII 파일의 기본 이름은 java.hprof.txt입니다. 2진 파일의 기본 이름은 java.hprof입니다.
force=y|n
일반적으로, 기본값(force=y)이 출력 파일에 있는 기존 정보를 겹쳐씁니다. 따라서 사용 가능한 HPROF와 함께 다중 JVM을 실행하려면, 필요한 경우 출력 파일 이름에 문자를 추가하는 force=n을 사용하십시오.
net=<host>:<port>
로컬 파일이 아닌 네트워크로 출력을 전송하려면 net 옵션을 사용하십시오.
depth=<size>
depth 옵션은 스택 추적에서 표시할 메소스 프레임 수를 표시합니다. 기본값은 4입니다.
thread=y|n
thread 옵션을 y로 설정하면, 각 추적 옆에 스레드 ID가 인쇄됩니다. 이 옵션은 어떤 스레드가 어떤 추적과 연관되어 있는지 확인할 수 없는 경우에 유용합니다. 이러한 문제점은 멀티스레드 애플리케이션에서 발생할 수 있습니다.
doe=y|n
기본 동작은 애플리케이션이 종료될 때 프로파일 정보를 수집하는 것입니다. 실행 중에 프로파일링 정보를 수집하려면 doe(종료 시 덤프)를 n으로 설정하십시오.
msa=y|n
이 기능은 IBM SDK 플랫폼에서 지원되지 않습니다.
cutoff=<value>
전체 실행 시간 중 적은 비율을 차지하는 부분에 대해 여러 샘플 항목이 생성됩니다. 기본적으로, HPROF에는 프로세서가 사용한 시간의 최소 0.0001퍼센트에 해당하는 모든 실행 경로가 포함됩니다. 이 옵션을 사용하면 해당 컷오프 지점을 늘리거나 줄일 수 있습니다. 예를 들어, 전체 실행 시간의 1퍼센트 중 4분의 1 미만을 차지하는 모든 항목을 제거하려면 cutoff=0.0025를 지정하십시오.
verbose=y|n
이 옵션은 덤프가 발생하면 메시지를 생성합니다. 기본값은 y입니다.
lineno=y|n
각 프레임은 일반적으로 처리된 행 번호를 포함하지만 이 옵션을 사용하여 출력 목록에서 행 번호를 숨길 수 있습니다. 사용 가능한 경우, 각 프레임에는 행 번호 대신 Unknown line 텍스트가 포함됩니다.
TRACE 1056:
java/util/Locale.toUpperCase(Locale.java:Unknown line)
java/util/Locale.<init>(Locale.java:Unknown line)
java/util/Locale.<clinit>(Locale.java:Unknown line)
sun/io/CharacterEncoding.aliasName(CharacterEncoding.java:Unknown line)