
jmap과 잘 작동하는 힙 덤프를 생성해야 합니다. 내 문제는 jmap이 heapdump 파일을 생성하는 데 시간이 매우 오래 걸린다는 것입니다. 특히 힙이 점점 커지면(> 1GB) 시간이 너무 오래 걸립니다.
한 가지 상황을 예로 들면,
서버가 힙 공간에 문제가 생기면 서버를 자동으로 다시 시작하고 다시 시작하기 전에 힙 덤프를 생성하고 싶습니다. 이것은 작동하지만 힙 덤프를 작성하는 데 시간이 너무 오래 걸립니다. 이렇게 하면 서버가 너무 오랫동안 다운됩니다. 힙 덤프 생성에는 1시간 이상이 소요됩니다.
에 대해 알고 있지만 -XX:+HeapDumpOnOutOfMemoryError
대부분의 경우 jvm에서 예외가 발생하기 전에 메모리 문제를 찾을 수 있습니다.
힙 덤프를 더 빠르게 작성하는 jmap에 대한 대안이 있습니까?
위의 예에 대한 특별한 솔루션도 높이 평가됩니다.
이 질문은 프로그래밍과 시스템 관리가 혼합된 질문이지만 여기가 올바른 위치에 있다고 생각합니다.
답변1
나는 내 질문에 대한 답을 찾았습니다. 이것serverfault에 대한 다른 질문에 대한 답변을 통해 아이디어를 얻었습니다.
- gdb를 사용하여 Java 프로세스에 연결
gdb --pid=<your java pid>
- gdb에서 코어 덤프 생성
gcore <file name>
detach
quit - Java 프로세스를 다시 시작하거나 원하는 대로 수행하세요.
- 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'.