Programming
No. | 795 |
Name. | swindler |
Subject. | tomcat 메모리 누수 찾기 |
Main Cate. | JSP/Servlet |
Sub Cate. | |
Date. | 2017-12-06 13:42 |
Hit. | 7751 (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 |
|
|
|
[Modify] [Delete] | [Reply] [List] |