본문 바로가기
Java

힙 덤프 (Heap Dump)

by 성건희 2022. 7. 28.
반응형

이전에 운영 어드민 서버가 갑자기 죽는 현상이 발생했다.
로그를 살펴보니 OOM 이 발생해서 서버가 다운됬는데, 정확한 원인 파악이 안되어서 선배 개발자분이 HeapDump 를 떠서 원인 파악을 했던 경험이 있다. 그 기억을 살려 힙 덤프 뜨는 법을 알아보자.

힙 덤프 뜨는 방법

먼저 운영 커버로스 서버로 접속한다.
그 후 아래 명령어로 실행중인 프로세스를 조회한다.

ps -ef | grep [프로세스이름]

ex ) ps -ef | grep 'gostop'

그러면 프로세스 번호를 알 수 있게 되는데, 해당 프로세스 번호로 힙 덤프를 뜨면 된다.

jmap -dump:format=b,file=[힙덤프 파일명].hprof [PID]

ex ) jmap -dump:format=b,file=testdump.hprof 31435
  • 참고
    • format=b : 포맷 형태를 바이너리로

덤프 파일이 생성될텐데, 주의할 점은 해당 서버에서 vi 등으로 힙 덤프 파일을 열면 안된다.
힙 메모리 사이즈만큼 서버의 메모리를 사용하게 되므로 서버가 다운 될 수도 있기 때문이다.


현재 회사의 경우 아래 과정을 통해 운영 서버로 접속하게 된다.

(로컬 터미널) -> (게이트웨이) -> (운영 커버로스 서버)

그렇기때문에 위에서 운영 커버로스 서버에 생성한 힙 덤프 파일로컬 터미널까지 옮겨주어어야 한다.
게이트웨이 서버로 이동 후 sftp 명령어로 운영 커버로스 원격 서버에 접속한다.

sftp [운영 커버로스 원격 서버명]

ex ) sftp www@test-103

그 후 힙 덤프 파일 인 testdump.hprof 를 게이트웨이로 다운받는다.

get testdump.hprof

그러면 게이트웨이에 testdump.hprof 파일이 생성되었을 것이다.
그럼 이제 로컬 터미널로 이동해서 sftp 로 게이트웨이에 접속하자.

sftp [게이트웨이 원격 서버명]

ex ) sftp geonhee@hcon.com

그 후 게이트웨이의 힙 덤프 파일을 로컬로 다운받는다.

get testdump.hprof

이클립스 MAT

힙 메모리 상황을 쉽게 파악하게 해주는 툴로 Eclipse MAT (Memory Analyzer) 가 있다.
Eclipse Memory Analyzer Open Source Project | The Eclipse Foundation 로 해당 툴을 다운받는다.

이제 덤프 파일(testdump.hprof) 을 열어주자.

Leak Suspects Report 로 실행하면 문제가 될 수 있는 부분을 Problem Suspect 란을 통해 알 수 있다.


하단의 Detail 을 누르면 객체의 비중을 파악할 수 있어 OOM 의 원인을 유추해 볼 수 있다.

참고

#공부/JAVA

반응형

댓글