이전에 운영 어드민 서버가 갑자기 죽는 현상이 발생했다.
로그를 살펴보니 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
'Java' 카테고리의 다른 글
java 버전 환경변수 등록 (0) | 2024.06.24 |
---|---|
Lazy 로 쿼리를 날리고 싶다면? (0) | 2023.09.12 |
Json 을 객체로 변환 시 boolean 타입 변수 인식 못하는 문제 (0) | 2022.02.16 |
[이펙티브 자바] 아이템 3. private 생성자나 열거 타입으로 싱글턴임을 보증하라 (0) | 2021.05.31 |
LinkedList (0) | 2021.05.30 |
댓글