Java 프로그램을 추적하는 방법은 무엇입니까?

Java 프로그램을 추적하는 방법은 무엇입니까?

시스템 관리자로서 저는 때때로 프로그램이 예기치 않게 작동하지만 오류가 전혀 발생하지 않거나 의미 없는 오류 메시지를 생성하는 상황에 직면합니다.

과거에는(Java 이전에는) 이 문제를 처리하는 두 가지 방법이 있었습니다.

  1. 아무 것도 도움이 되지 않는다면 - RTFM ;-)
  2. 1. 도움이 되지 않는 경우 - 시스템 호출을 추적하고 무슨 일이 일어나고 있는지 확인하세요.

나는 일반적으로 strace -f이 작업을 위해 Linux를 사용합니다(다른 운영 체제에도 비슷한 추적 도구가 있습니다). 자, 이것은 일반적으로 모든 구식 프로그램에 적용되지만,자바-프로세스. 실제 작업과 관련이 없어 보이는 시스템 호출이 너무 많아서 이런 덤프에서 검색하는 것은 끔찍합니다.

이를 수행하는 더 좋은 방법이 있습니까(소스 코드를 사용할 수 없는 경우)?

답변1

ckhan이 언급했듯이 jstackJVM의 모든 활성 스레드에 대한 완전한 스택 추적을 제공하므로 훌륭합니다. JVM의 stderr에서 SIGQUIT를 사용하여 동일한 결과를 얻을 수 있습니다.

또 다른 유용한 도구는 jmap프로세스의 PID를 사용하여 JVM 프로세스에서 힙 덤프를 가져올 수 있다는 것입니다.

jmap -dump:file=/tmp/heap.hprof $PID

visualvm이 힙 덤프는 jvisualvm(현재 표준 Oracle Java SDK 설치의 일부)과 같은 도구 에 로드될 수 있습니다 . 또한 VisualVM은 실행 중인 JVM에 연결하여 내부 CPU 사용량, 스레드 수 및 힙 사용량을 보여주는 그래프를 포함하여 JVM에 대한 정보를 표시할 수 있어 누수 추적에 이상적입니다.

숫자 매개변수(예:)로 실행할 때 vmstat jstat와 마찬가지로 일정 기간 동안 JVM의 가비지 수집 통계를 수집할 수 있는 또 다른 도구입니다 .vmstat 3

마지막으로 Java 프록시를 사용하여 로드 시 모든 개체의 모든 메서드에 대한 계측을 푸시할 수 있습니다. 라이브러리를 사용하면 javassist이 작업을 쉽게 수행할 수 있습니다. 따라서 자신만의 추적을 추가하는 것이 가능합니다. 어려운 부분은 항상 추적 출력을 얻는 것이 아니라 필요할 때만 추적 출력을 얻는 방법을 찾는 것입니다. 이로 인해 JVM 속도가 느려질 수 있습니다. 이런 식으로 작동하는 프로그램이 있습니다 dtrace. 나는 시도했지만 그다지 성공적이지는 않았습니다. JVM을 부팅하는 데 필요한 클래스는 에이전트가 감지하기 전에 로드되고 그런 다음 해당 클래스에 계측을 추가하기에는 너무 늦기 때문에 에이전트가 모든 클래스를 계측할 수는 없습니다.

나의 충고- VisualVM으로 시작하여 JVM의 현재 스레드와 중요한 통계를 표시할 수 있으므로 알아야 할 사항을 알려주는지 확인하세요.

답변2

마찬가지로 Linux 시스템에서 잘못된 프로그램을 디버깅할 때 유사한 도구를 사용하여 시스템에서 실행 중인 JVM을 디버깅할 수 있습니다.

도구 #1 - jvmtop

와 유사하게 top사용할 수 있습니다.VM 상단시스템에서 실행 중인 JVM의 클래스 상태를 봅니다. 일단 설치되면 다음과 같이 호출할 수 있습니다.

$ jvmtop.sh

출력은 이 도구와 유사합니다 top.

 JvmTop 0.8.0 alpha   amd64  8 cpus, Linux 2.6.32-27, load avg 0.12
 http://code.google.com/p/jvmtop

  PID MAIN-CLASS      HPCUR HPMAX NHCUR NHMAX    CPU     GC    VM USERNAME   #T DL
 3370 rapperSimpleApp  165m  455m  109m  176m  0.12%  0.00% S6U37 web        21
11272 ver.resin.Resin [ERROR: Could not attach to VM]
27338 WatchdogManager   11m   28m   23m  130m  0.00%  0.00% S6U37 web        31
19187 m.jvmtop.JvmTop   20m 3544m   13m  130m  0.93%  0.47% S6U37 web        20
16733 artup.Bootstrap  159m  455m  166m  304m  0.12%  0.00% S6U37 web        46

도구 #2 - jvmmonitor

또 다른 옵션은 다음을 사용하는 것입니다.가상 머신 모니터. JVM Monitor는 Java 애플리케이션의 CPU, 스레드 및 메모리 사용량을 모니터링하는 Eclipse와 통합된 Java 프로파일러입니다. 이를 사용하여 로컬 호스트에서 실행 중인 JVM을 자동으로 찾거나 port@host를 사용하여 원격 JVM에 연결할 수 있습니다.

jvmmonitor의 ss

도구 #3 - Visualvm

시각적 가상 머신JVM 문제를 디버깅할 때 사용해야 하는 "도구"일 수 있습니다. 기능 세트는 매우 깊으며 내부를 매우 자세히 살펴볼 수 있습니다.

애플리케이션 성능 분석 또는 메모리 할당 분석:

VisualVM #2용 SS

스레드 덤프를 가져오고 표시합니다.

VisualVM #3용 SS

인용하다

답변3

고려하다jstack. 별로 일치하지 않습니다 strace.pstack- 시뮬레이션되었지만 최소한 시간에 맞춰 스냅샷 사진을 제공합니다. 원하는 경우 함께 묶어 대략적인 추적을 얻습니다.

이 SO 기사의 조언도 참조하십시오.https://stackoverflow.com/questions/1025681/call-trace-in-java

답변4

꼭 드셔보시길 추천드려요잭 게임, 코드 변경이나 재배포 없이 메소드 시작 및 종료를 추적할 수 있는 JVM 추적 도구입니다.

관련 정보