source: http://slothink.tistory.com/123
대부분이 OOME 등이 발생하면 이런 쉬운것(메모리 분석)도 안해보고 왜 그러지, 왜 그러지 하면서 이것저것 손보는데 시간만 보내기십상이다.
일단 이거 엄청 간단하니깐 일단 이렇게부터 해보구 삽질을 했으면 좋겠다.-_- 여우같은 마눌 보러 가야징
JVM 메모리 분석을 위한 과정은 다음과 같다.
- 분석할 프로세스 ID 조회
- 메모리 힙덤프 추출
- 힙덤프 분석
분석할 프로세스 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
이거 가지고 잘 모르겠다면, '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 원인까지 찾아주는 기능이 있다.
받아서 설치하자. (그냥 압축 풀면 끝이다.)
설치 후에 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 |