4,551,247 th visitor since 2017.2.1 ( Today : 785 )
Programming
No. 795
Name. swindler
Subject. tomcat 메모리 누수 찾기
Main Cate. JSP/Servlet
Sub Cate.
Date. 2017-12-06 13:42
Hit. 7076 (125.131.199.20)
File.
일반적으로 heap dump를 떠서 확인할수 있다.

kill -3 <pid> 와 같이 실행한다. 그렇게 해도 안 찍히면 jmap을 사용한다.



먼저 tomcat의 process ID를 찾은 다음에,

jmap -dump:format=b,file=heap.hprof 29999 와 같이 실행한다.

아래와 같이 에러가 나는 경우가 있다.

31069: Unable to open socket file: target process not responding or HotSpot VM not loaded
The -F option can be used when the target process is not responding

-F 옵션을 주고 다시 실행한다.
jmap -F -dump:format=b,file=heap.hprof 11883


Attaching to process ID 11883, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 23.25-b01
Dumping heap to heap.hprof ...
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:622)
at sun.tools.jmap.JMap.runTool(JMap.java:196)
at sun.tools.jmap.JMap.main(JMap.java:128)
Caused by: sun.jvm.hotspot.utilities.AssertionFailure: Expecting GenCollectedHeap, G1CollectedHeap, or ParallelScavengeHeap, but got sun.jvm.hotspot.gc_interface.CollectedHeap
at sun.jvm.hotspot.utilities.Assert.that(Assert.java:32)
at sun.jvm.hotspot.oops.ObjectHeap.collectLiveRegions(ObjectHeap.java:605)
at sun.jvm.hotspot.oops.ObjectHeap.iterate(ObjectHeap.java:244)
at sun.jvm.hotspot.utilities.AbstractHeapGraphWriter.write(AbstractHeapGraphWriter.java:51)
at sun.jvm.hotspot.utilities.HeapHprofBinWriter.write(HeapHprofBinWriter.java:416)
at sun.jvm.hotspot.tools.HeapDumper.run(HeapDumper.java:56)
at sun.jvm.hotspot.tools.Tool.start(Tool.java:221)
at sun.jvm.hotspot.tools.HeapDumper.main(HeapDumper.java:77)
... 6 more


위와 같이 에러가 나면서 정상적으로 dump 가 만들어지지 않는다.
java가 여러개 설치된 경우, 해당 프로세스가 실행된 java 버전과 jmap 버전이 안 맞아서
해당 프로세스가 실행된 java 경로에 있는 jmap을 실행하였으나, 결과는 동일.

혹자는 openjdk를 사용하는 경우 debuginfo 라는 패키지를 별도로 설치해야 된다고 한다.
그런데 java-1.6.0-openjdk 에는 debuginfo 패키지가 없는듯?

yum search java-1.6.0

java-1.6.0-openjdk.i686 : OpenJDK Runtime Environment
java-1.6.0-openjdk-demo.i686 : OpenJDK Demos
java-1.6.0-openjdk-devel.i686 : OpenJDK Development Environment
java-1.6.0-openjdk-javadoc.i686 : OpenJDK API Documentation
java-1.6.0-openjdk-src.i686 : OpenJDK Source Bundle

repository에서 못 찾는것 같아서, 아래와 같이 이름으로 구글링해서 파일을 다운로드

java-1.6.0-openjdk-debuginfo-1.6.0.37-1.13.9.4.el6_7.i686

설치하고 하였으나, 여전히 같은 에러 메세지 ㅠㅠ

참고로 tomcat이 동작하는건 java-1.6.0 이고
설치되어 있던 java는 1.7.0
1.7.0의 jmap으로 다시 시도하면서 (의미가 있나?)
1.7.0의 debuginfo 패키지를 다시 설치
당연히 될리가 있나...

참고로 jmap 관련 버그도 있다고 한다.
JDK-6966967 : G1: SA: jmap and jstack do not work
http://bugs.java.com/view_bug.do?bug_id=6966967


그리고 jmap으로 덤프를 뜨지 못하는 경우 OS 바이너리 덤프로부터 heap dump를 추출할 수 있다고 한다. (HotSpot JVM 한정)

gcore -o core.dump [pid]

바이너리 덤프에서 heap dump를 추출하는 법

jmap -dump:format=b,file=[파일명] [자바경로] [바이너리덤프]

$ jmap -dump:format=b,file=myDump.hprof /usr/bin/java core.10883


버그 문서를 봐도 모르겠고, (버그라는데 뭐 내가 해결할 수 있는 것도 아니고..)
gcore를 떴으나, heap dump 추출이 안 된다.


/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.37/bin/jmap -dump:format=b,file=heap.hprof /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.37/bin/java core.dump.11883

이렇게 실행했으나, 아래와 같이 오류가 남.

Attaching to core core.dump.11883 from executable /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.37/bin/java, please wait...
Error attaching to core file: Can't attach to the core file




아래는 구글링중에 찾은 다른 사람의 jmap 오류 메세지인데,

Attaching to process ID 22191, please wait...
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at sun.tools.jmap.JMap.runTool(JMap.java:197)
at sun.tools.jmap.JMap.main(JMap.java:128)
Caused by: sun.jvm.hotspot.runtime.VMVersionMismatchException: Supported versions are 24.51-b03. Target VM is 24.45-b08
at sun.jvm.hotspot.runtime.VM.checkVMVersion(VM.java:234)
at sun.jvm.hotspot.runtime.VM.<init>(VM.java:297)
at sun.jvm.hotspot.runtime.VM.initialize(VM.java:368)
at sun.jvm.hotspot.bugspot.BugSpotAgent.setupVM(BugSpotAgent.java:598)
at sun.jvm.hotspot.bugspot.BugSpotAgent.go(BugSpotAgent.java:493)
at sun.jvm.hotspot.bugspot.BugSpotAgent.attach(BugSpotAgent.java:331)
at sun.jvm.hotspot.tools.Tool.start(Tool.java:163)
at sun.jvm.hotspot.tools.HeapSummary.main(HeapSummary.java:40)
... 6 more
You have new mail in /var/spool/mail/root

이 경우에는 중간에 Caused by 부분에 보면
Supported version과 Target VM이 다르다는 내용이 있다. 즉 Java 버전이 달라서 그렇다는건데, 나하고는 다른 종류의 오류구나.


혹자가 말하기를
root계정으로 실행하면 안 되고, 해당 프로세스를 실행한 계정과 같은걸로 해야 된다 그래서, 그렇게도 해 봤는데 역시나 안 된다.



혹자는 java-1.6.0-openjdk-headless 패키지를 설치하라고 하는데,
아무리 찾아봐도 그런건 없는듯.
java-1.6.0-openjdk-headless-1.6.0.37-1.13.9.4.el6_7.i686

아마도 1.8부터 추가된 패키지가 아닌가 싶다.



[바로가기 링크] : http://coolx.net/cboard/develop/795



Name
Password
Comment
Copyright © 1999-2017, swindler. All rights reserved. 367,611 visitor ( 1999.1.8-2004.5.26 ), 2,405,771 ( -2017.01.31)

  2HLAB   2HLAB_Blog   RedToolBox   Omil   Omil_Blog