시스템 관리자로서 저는 때때로 프로그램이 예기치 않게 작동하지만 오류가 전혀 발생하지 않거나 의미 없는 오류 메시지를 생성하는 상황에 직면합니다.
과거에는(Java 이전에는) 이 문제를 처리하는 두 가지 방법이 있었습니다.
- 아무 것도 도움이 되지 않는다면 - RTFM ;-)
- 1. 도움이 되지 않는 경우 - 시스템 호출을 추적하고 무슨 일이 일어나고 있는지 확인하세요.
나는 일반적으로 strace -f
이 작업을 위해 Linux를 사용합니다(다른 운영 체제에도 비슷한 추적 도구가 있습니다). 자, 이것은 일반적으로 모든 구식 프로그램에 적용되지만,자바-프로세스. 실제 작업과 관련이 없어 보이는 시스템 호출이 너무 많아서 이런 덤프에서 검색하는 것은 끔찍합니다.
이를 수행하는 더 좋은 방법이 있습니까(소스 코드를 사용할 수 없는 경우)?
답변1
ckhan이 언급했듯이 jstack
JVM의 모든 활성 스레드에 대한 완전한 스택 추적을 제공하므로 훌륭합니다. 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에 연결할 수 있습니다.
도구 #3 - Visualvm
시각적 가상 머신JVM 문제를 디버깅할 때 사용해야 하는 "도구"일 수 있습니다. 기능 세트는 매우 깊으며 내부를 매우 자세히 살펴볼 수 있습니다.
애플리케이션 성능 분석 또는 메모리 할당 분석:
스레드 덤프를 가져오고 표시합니다.
인용하다
답변3
고려하다jstack
. 별로 일치하지 않습니다 strace
.pstack
- 시뮬레이션되었지만 최소한 시간에 맞춰 스냅샷 사진을 제공합니다. 원하는 경우 함께 묶어 대략적인 추적을 얻습니다.
이 SO 기사의 조언도 참조하십시오.https://stackoverflow.com/questions/1025681/call-trace-in-java
답변4
꼭 드셔보시길 추천드려요잭 게임, 코드 변경이나 재배포 없이 메소드 시작 및 종료를 추적할 수 있는 JVM 추적 도구입니다.