jmap보다 성능이 뛰어난 힙 덤프 생성을 위한 대안은 무엇입니까?

jmap보다 성능이 뛰어난 힙 덤프 생성을 위한 대안은 무엇입니까?

jmap과 잘 작동하는 힙 덤프를 생성해야 합니다. 내 문제는 jmap이 heapdump 파일을 생성하는 데 시간이 매우 오래 걸린다는 것입니다. 특히 힙이 점점 커지면(> 1GB) 시간이 너무 오래 걸립니다.

한 가지 상황을 예로 들면,
서버가 힙 공간에 문제가 생기면 서버를 자동으로 다시 시작하고 다시 시작하기 전에 힙 덤프를 생성하고 싶습니다. 이것은 작동하지만 힙 덤프를 작성하는 데 시간이 너무 오래 걸립니다. 이렇게 하면 서버가 너무 오랫동안 다운됩니다. 힙 덤프 생성에는 1시간 이상이 소요됩니다.

에 대해 알고 있지만 -XX:+HeapDumpOnOutOfMemoryError대부분의 경우 jvm에서 예외가 발생하기 전에 메모리 문제를 찾을 수 있습니다.

힙 덤프를 더 빠르게 작성하는 jmap에 대한 대안이 있습니까?
위의 예에 대한 특별한 솔루션도 높이 평가됩니다.

이 질문은 프로그래밍과 시스템 관리가 혼합된 질문이지만 여기가 올바른 위치에 있다고 생각합니다.

답변1

나는 내 질문에 대한 답을 찾았습니다. 이것serverfault에 대한 다른 질문에 대한 답변을 통해 아이디어를 얻었습니다.

  1. gdb를 사용하여 Java 프로세스에 연결
    gdb --pid=<your java pid>
  2. gdb에서 코어 덤프 생성
    gcore <file name>
    detach
    quit
  3. Java 프로세스를 다시 시작하거나 원하는 대로 수행하세요.
  4. jmap을 코어 덤프에 연결하여 코어 덤프에서 힙 덤프를 생성합니다.
    jmap -heap:format=b <path to java binary> <core dump file>

4단계에서는 올바른 Java 바이너리를 지정하는 것이 중요합니다. 그렇지 않으면 jmap이 코어 덤프에 연결할 수 없습니다. Java 프로세스에 어떤 바이너리가 사용되었는지 확실하지 않은 경우 gdb를 사용하여 코어 덤프를 엽니다.
gdb --core=<core dump file>
다음과 같은 줄이 표시되어 전체 경로를 알려줍니다.
Core was generated by '/opt/tomcat/bin/jsvc'.

jmap을 통해 직접 힙 덤프를 생성하는 것보다 코어 덤프를 생성하는 것이 훨씬 빠릅니다. 이렇게 하면 너무 긴 가동 중지 시간 없이 Java 프로세스의 힙 덤프를 만들 수 있습니다.

편집:
다음 오류 메시지가 나타나면 잘못된 Java 바이너리를 지정했을 수 있습니다.

Error attaching to core file: Can't attach to the core file

jmap 호출에 적합한 Java 바이너리를 얻으려면 gdb를 사용하여 코어 덤프를 엽니다.

gdb --core=[path tp core file]

올바른 바이너리를 알려주는 다음과 같은 줄이 있습니다.

Core was generated by `/opt/tomcat/bin/jsvc'.

관련 정보