[java] 콘솔에서 실행되지 않는 Windows에서 Java 프로세스의 스레드 및 힙 덤프를 얻는 방법

콘솔에서 실행하는 Java 응용 프로그램이 있으며 다른 Java 프로세스를 실행합니다. 해당 자식 프로세스의 스레드 / 힙 덤프를 가져오고 싶습니다.

유닉스에서는 할 수 kill -3 <pid>있지만 Windows AFAIK에서는 스레드 덤프를 얻는 유일한 방법은 콘솔의 Ctrl-Break입니다. 그러나 그것은 저에게 부모 프로세스의 덤프를 제공하지만 자식은 아닙니다.

해당 힙 덤프를 얻는 다른 방법이 있습니까?



답변

jmap을 알고 있다고 가정하면 실행중인 프로세스의 덤프를 얻는 데 사용할 수 있습니다 pid.

작업 관리자 또는 리소스 모니터를 사용하여 pid. 그때

jmap -dump:format=b,file=cheap.hprof <pid>

해당 프로세스의 힙을 가져옵니다.


답변

두 개의 다른 Java 덤프를 혼동하고 있습니다. kill -3힙 덤프가 아닌 스레드 덤프를 생성합니다.

스레드 덤프 = JVM 출력의 각 스레드에 대한 스택 추적으로 텍스트로 stdout합니다.

힙 덤프 = JVM 프로세스의 메모리 내용이 2 진 파일로 출력됩니다.

Windows에서 스레드 덤프를 수행하려면 JVM이 포 그라운드 프로세스 인 경우 CTRL+ BREAK가 가장 간단한 방법입니다. Cygwin 또는 MobaXterm과 같은 Windows kill -3 {pid}에 유닉스 계열 쉘이 있으면 Unix에서와 같이 사용할 수 있습니다.

Unix에서 스레드 덤프를 가져 오려면 JVM이 포 그라운드 프로세스이거나 JVM에 대한 올바른 PID를 얻는 한 작동 하는 경우 CTRL+ .Ckill -3 {pid}

두 플랫폼 중 하나에 Java에는 도움이되는 여러 유틸리티가 제공됩니다. 스레드 덤프의 경우 jstack {pid}가장 좋은 방법입니다. http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jstack.html

덤프 문제를 해결하는 것 : 힙 덤프는 해석하기 어렵 기 때문에 일반적으로 사용되지 않습니다. 그러나 어디에서 어떻게 볼 것인지 알고 있다면 유용한 정보가 많이 있습니다. 가장 일반적인 사용법은 메모리 누수를 찾는 것입니다. -DOutOfMemoryError시 힙 덤프가 자동으로 생성되도록 java 명령 행 에서 on 을 설정하는 것이 좋지만 -XX:+HeapDumpOnOutOfMemoryError 수동으로 힙 덤프를 트리거 할 수도 있습니다. 가장 일반적인 방법은 java 유틸리티를 사용하는 것 jmap입니다.

참고 : 이 유틸리티는 모든 플랫폼에서 사용 가능한 것은 아닙니다. JDK 1.6부터 jmapWindows에서 사용할 수 있습니다.

예제 명령 줄은 다음과 같습니다.

jmap -dump:file=myheap.bin {pid of the JVM}

출력 “myheap.bin”은 사람이 읽을 수 없으며 (대부분의 사람들에게) 분석 할 도구가 필요합니다. 선호하는 것은 매트입니다. http://www.eclipse.org/mat/


답변

Linux 프로세스에서 .hprof 파일을 만드는 가장 좋은 방법은 jmap 명령을 사용하는 것입니다. 예를 들면 다음과 같습니다.jmap -dump:format=b,file=filename.hprof {PID}


답변

언급 된 jconsole / visualvm을 사용하는 것 외에도 jstack -l <vm-id>다른 명령 행 창에서 사용하여 해당 출력을 캡처 할 수 있습니다 .

<vm-id>는 작업 관리자 (Windows 및 UNIX의 프로세스 ID) 또는을 사용하여 찾을 수 jps있습니다.

둘 다 jstack하고 jps있는 일 JDK 버전 6 이상에 포함되어 있습니다.


답변

JDK (jvisualvm.exe)와 함께 배포 된 Java VisualVM을 권장합니다. 동적으로 연결하고 스레드와 힙에 액세스 할 수 있습니다. 나는 몇 가지 문제에 대해 귀중한 것을 발견했습니다.


답변

server-jre 8 이상인 경우 다음을 사용할 수 있습니다.

jcmd PID GC.heap_dump /tmp/dump


답변

아래 옵션 중 하나를 시도하십시오.

  1. 32 비트 JVM의 경우 :

    jmap -dump:format=b,file=<heap_dump_filename> <pid>
  2. 64 비트 JVM (명시 인용)의 경우 :

    jmap -J-d64 -dump:format=b,file=<heap_dump_filename> <pid>
  3. VM 매개 변수에 G1GC 알고리즘이있는 64 비트 JVM의 경우 (G1GC 알고리즘으로 라이브 오브젝트 힙만 생성됨) :

    jmap -J-d64 -dump:live,format=b,file=<heap_dump_filename> <pid>

관련 SE 질문 : jmap 명령으로 Java 힙 덤프 오류 : 조기 EOF

jmap기사 에서 다양한 옵션을 살펴보십시오.