Programming

(Java) 겁나 간단히 OOME 찾기 (메모리 분석하기)

steloflute 2016. 10. 11. 23:30

source: http://slothink.tistory.com/123


크리에이티브 커먼즈 라이선스
Creative Commons License

대부분이 OOME 등이 발생하면 이런 쉬운것(메모리 분석)도 안해보고 왜 그러지, 왜 그러지 하면서 이것저것 손보는데 시간만 보내기십상이다. 

일단 이거 엄청 간단하니깐 일단 이렇게부터 해보구 삽질을 했으면 좋겠다.-_- 여우같은 마눌 보러 가야징


JVM 메모리 분석을 위한 과정은 다음과 같다.

  1. 분석할 프로세스 ID 조회
  2. 메모리 힙덤프 추출
  3. 힙덤프 분석

분석할 프로세스 ID 조회

프로세스 id 조회는 ps - ef | grep 찾을 놈 관련된 텍스트 와 같이 하면 아래와 같이 귀찮게 나올 수 있다. 이건 뭐, 얼마 안된 케이스긴 하지만. 여튼 그렇다.

 

shell.sh
[freshkorea@multi-003 ~]$ ps -ef | grep freshkorea
root     12044  3911  0 15:16 ?        00:00:00 sshd: freshkorea [priv]
1493     12105 26169  0 15:16 ?        00:00:00 /usr/local/apache2/bin/httpd -k start -f /usr/local/apache2/conf/hosting/freshkorea/httpd.conf
1493     12205 12044  0 15:17 ?        00:00:00 sshd: freshkorea@pts/2
1493     12655 26169  0 15:17 ?        00:00:00 /usr/local/apache2/bin/httpd -k start -f /usr/local/apache2/conf/hosting/freshkorea/httpd.conf
1493     12925 26169  0 15:17 ?        00:00:00 /usr/local/apache2/bin/httpd -k start -f /usr/local/apache2/conf/hosting/freshkorea/httpd.conf
1493     13004 26169  0 15:17 ?        00:00:00 /usr/local/apache2/bin/httpd -k start -f /usr/local/apache2/conf/hosting/freshkorea/httpd.conf
1493     13005 26169  0 15:17 ?        00:00:00 /usr/local/apache2/bin/httpd -k start -f /usr/local/apache2/conf/hosting/freshkorea/httpd.conf
1493     14438 12206  0 15:17 pts/2    00:00:00 grep freshkorea
root     26169     1  0 Jan30 ?        00:05:26 /usr/local/apache2/bin/httpd -k start -f /usr/local/apache2/conf/hosting/freshkorea/httpd.conf
root     27019  3911  0 15:11 ?        00:00:00 sshd: freshkorea [priv]
1493     27051 27019  0 15:11 ?        00:00:00 sshd: freshkorea@notty
1493     29991     1  1 Mar29 ?        00:44:22 /usr/local/jdk/bin/java -Djava.util.logging.config.file=/home/hosting_users/freshkorea/tomcat/conf/logging.properties -XX:MaxPermSize=128m -Xmx128m -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/home/hosting_users/freshkorea/tomcat/endorsed -classpath /home/hosting_users/freshkorea/tomcat/bin/bootstrap.jar -Dcatalina.base=/home/hosting_users/freshkorea/tomcat -Dcatalina.home=/home/hosting_users/freshkorea/tomcat -Djava.io.tmpdir=/home/hosting_users/freshkorea/tomcat/temp org.apache.catalina.startup.Bootstrap start

그럴 땐 JDK/bin 밑에 있는 jps 명령을 이용하자.

jps 는 현재 계정의 java 프로세스만 보여준다.

 

shell.sh
[freshkorea@multi-003 ~]$ jps
29991 Bootstrap
14957 Jps

와우! 바로 딱 나온다. 

tomcat 은 실행시 bootstrap.jar 를 이용하기 때문에 bootstrap 으로 나온다.
이거 가지고 잘 모르겠다면, 'jps -mlv' 이렇게 쳐보라. -_-)b

메모리 힙덤프 추출

보통 힙 덤프 뜰 땐 kill -3 <pid> 를 사용한다. 허나, 그렇게 해도 안찍힐 경우에 jmap 을 이용해 보자.
jmap dump:format=b,file=<output filename> <pid>
메모리 분석을 위해서 fomat=b 을 줌으로써, 바이너리 파일로 생성해야한다.

 

healdump.sh
[freshkorea@multi-003 ~]$ jmap -dump:format=b,file=heap.hprof 29991
Dumping heap to /home/hosting_users/freshkorea/heap.hprof ...
Heap dump file created
[freshkorea@multi-003 ~]$

힙덤프 분석

힙덤프는 분석 툴을 이용해 분석하는게 편하다. eclipse 의 mat 은 공짜이면서 leak 원인까지 찾아주는 기능이 있다.

http://www.eclipse.org/mat/

받아서 설치하자. (그냥 압축 풀면 끝이다.)

설치 후에 Fille -> Open -> Heap dump 를 하면 결과가 다음처럼 대충 나온다. 

 

 

그리고 Details 를 클릭해서 들어가보면 다음과 같이 나온다. 

여기선 hashMap 이 아주 무식하다는게 드러난다. 

 

이제 소스를 보면 왜 이런 참상이 생겼는지 알꺼다.

이렇게 OOME 가 엄청 간단하게 해결되었다.


'Programming' 카테고리의 다른 글

[Java] Classpath와 환경변수  (0) 2017.02.10
Shared libraries with GCC on Linux  (0) 2016.12.04
오라클 JDBC 테스트  (0) 2016.05.11
Ms Windows Global Context Menu  (0) 2016.04.05
OpenSSL AES 암복호화  (0) 2016.04.04