JProfiler 도움말

스냅샷

지금까지는 프로파일링 에이전트가 프로파일된 JVM 내부에서 실행되고 있는 라이브 세션만 살펴보았습니다. JProfiler GUI는 해당 에이전트로부터 데이터를 가져옵니다. JProfiler는 모든 프로파일링 데이터를 파일로 저장하는 스냅샷도 지원합니다. 이는 여러 상황에서 유용할 수 있습니다:

  • 예를 들어 테스트의 일부로 프로파일링 데이터를 자동으로 기록해야 하거나, JProfiler GUI와 연결이 불가능한 경우에 사용할 수 있습니다.
  • 서로 다른 프로파일링 세션의 데이터를 비교하거나, 이전에 기록한 데이터를 확인하고 싶을 때 사용할 수 있습니다.
  • 다른 사람과 프로파일링 데이터를 공유하고 싶을 때 사용할 수 있습니다.

스냅샷에는 모든 녹화 데이터가 포함되며, heap 스냅샷도 포함됩니다. 디스크 공간을 절약하기 위해 스냅샷은 압축되어 저장되지만, heap walker 데이터는 직접 메모리 매핑을 지원하기 위해 압축되지 않은 상태로 유지됩니다.

JProfiler GUI에서 스냅샷 저장 및 열기

라이브 세션을 프로파일링하는 동안 스냅샷 저장 툴바 버튼을 사용하여 스냅샷을 생성할 수 있습니다. JProfiler는 원격 에이전트에서 모든 프로파일링 데이터를 가져와 ".jps" 확장자를 가진 로컬 파일로 저장합니다. 라이브 세션 중에 여러 개의 스냅샷을 저장할 수 있습니다. 이들은 자동으로 열리지 않으며, 프로파일링을 계속 진행할 수 있습니다.

저장된 스냅샷은 파일→최근 스냅샷 메뉴에 자동으로 추가되므로, 방금 저장한 스냅샷을 편리하게 열 수 있습니다. 라이브 세션이 아직 실행 중일 때 스냅샷을 열면, 라이브 세션을 종료할지 또는 새로운 JProfiler 창을 열지 선택할 수 있습니다.

JProfiler에서 스냅샷 비교 기능을 사용할 때, 현재 라이브 세션에서 저장한 모든 스냅샷 목록이 표시됩니다. 이를 통해 다양한 사용 사례를 쉽게 비교할 수 있습니다.

일반적으로 세션→스냅샷 열기를 메인 메뉴에서 선택하거나, 파일 관리자의 스냅샷 파일을 더블 클릭하여 스냅샷을 열 수 있습니다. JProfiler의 IDE 통합 기능을 사용하면 IDE 자체의 파일 열기 액션을 통해서도 JProfiler 스냅샷을 열 수 있습니다. 이 경우, 내장 소스 코드 뷰어 대신 IDE에서 소스 코드 네비게이션을 사용할 수 있습니다.

스냅샷을 열면 모든 녹화 관련 액션이 비활성화되고, 녹화된 데이터가 있는 뷰만 사용할 수 있습니다. 어떤 종류의 데이터가 녹화되었는지 확인하려면 상태 표시줄의 녹화 라벨 위에 마우스를 올려보세요.

단명 프로그램 프로파일링

라이브 세션의 경우, 모든 프로파일링 데이터는 프로파일된 JVM의 프로세스 내에 존재합니다. 따라서 프로파일된 JVM이 종료되면 JProfiler의 프로파일링 세션도 함께 종료됩니다. JVM이 종료된 후에도 프로파일링을 계속하려면, 세션 시작 대화상자에서 두 가지 옵션 중 하나를 활성화할 수 있습니다.

  • JVM이 실제로 종료되지 않도록 방지하고, JProfiler GUI가 연결되어 있는 동안 JVM을 인위적으로 살아있게 유지할 수 있습니다. 하지만 IDE에서 테스트 케이스를 프로파일링하고, IDE의 테스트 콘솔에서 상태와 총 시간을 확인하고 싶을 때는 이 방법이 바람직하지 않을 수 있습니다.
  • JVM이 종료될 때 JProfiler가 스냅샷을 저장하고, 즉시 해당 스냅샷으로 전환하도록 설정할 수 있습니다. 이 스냅샷은 임시로 저장되며, 세션을 닫을 때 삭제됩니다. 단, 먼저 스냅샷 저장 액션을 사용하면 영구적으로 저장할 수 있습니다.

트리거로 스냅샷 저장하기

자동화된 프로파일링 세션의 최종 결과는 항상 하나 이상의 스냅샷입니다. 트리거에서는 "스냅샷 저장" 액션을 추가하여, 프로파일된 JVM이 실행 중인 머신에 스냅샷을 저장할 수 있습니다. 라이브 세션 중에 트리거가 실행되면, 스냅샷은 원격 머신에도 저장되며, 이미 JProfiler GUI로 전송된 일부 데이터가 포함되지 않을 수 있습니다.

트리거로 스냅샷을 저장하는 기본 전략은 두 가지가 있습니다:

  • 테스트 케이스의 경우, "JVM 시작" 트리거에서 녹화를 시작하고, "JVM 종료" 트리거를 추가하여 JVM이 종료될 때 스냅샷을 저장합니다.
  • "CPU 부하 임계값" 트리거나 "타이머 트리거"와 같은 예외적 조건 또는 주기적 프로파일링의 경우, 일부 데이터를 녹화한 후 "Sleep" 액션을 사이에 두고 스냅샷을 저장합니다.

HPROF heap 스냅샷

heap 스냅샷을 생성하는 과정에서 오버헤드가 너무 크거나 메모리 사용량이 너무 많아지는 경우, JVM이 기본적으로 제공하는 HPROF heap 스냅샷을 사용할 수 있습니다. 이 작업에는 프로파일링 에이전트가 필요하지 않으므로, 운영 환경에서 실행 중인 JVM의 메모리 문제를 분석할 때 유용합니다.

JProfiler에서는 다음 세 가지 방법으로 이러한 스냅샷을 얻을 수 있습니다:

  • 라이브 세션의 경우, JProfiler GUI의 메인 메뉴에서 HPROF heap 덤프를 트리거하는 액션을 제공합니다.
  • JProfiler에는 OutOfMemoryError가 발생할 때 HPROF 스냅샷을 저장하는 "Out of memory exception" 트리거가 있습니다. 이는 HotSpot JVM에서 지원하는 VM 파라미터
    -XX:+HeapDumpOnOutOfMemoryError 
    와 동일합니다.
  • JDK의 jmap 실행 파일을 사용하여 실행 중인 JVM에서 HPROF heap 덤프를 추출할 수 있습니다.

    JProfiler에는 jmap보다 더 다양한 기능을 제공하는 커맨드라인 도구 jpdump가 포함되어 있습니다. 이 도구는 프로세스 선택, Windows 서비스로 실행 중인 프로세스 연결, 32비트/64비트 JVM 혼합 환경 지원, HPROF 스냅샷 파일 자동 번호 지정 등의 기능을 제공합니다. 자세한 정보는 -help 옵션으로 확인할 수 있습니다.

JDK Flight Recorder 스냅샷

JProfiler는 Java Flight Recorder(JFR)에서 저장한 스냅샷 열기를 완벽하게 지원합니다. 이 경우 UI가 JFR의 기능에 맞게 다르게 표시됩니다. 자세한 내용은 JFR 도움말 항목을 참고하세요.