2015-11-16 47 views
16

當試圖從正在運行的Java進程獲取堆轉儲時,我得到此Stacktrace。造成這種情況的原因是什麼?爲了做出適當的堆轉儲,我需要做些什麼?Java堆轉儲錯誤 - 元數據似乎不是多態

Dumping heap to dump.bin ... 
Exception in thread "main" java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:483) 
    at sun.tools.jmap.JMap.runTool(JMap.java:201) 
    at sun.tools.jmap.JMap.main(JMap.java:130) 
Caused by: java.lang.InternalError: Metadata does not appear to be polymorphic 
    at sun.jvm.hotspot.types.basic.BasicTypeDataBase.findDynamicTypeForAddress(BasicTypeDataBase.java:278) 
    at sun.jvm.hotspot.runtime.VirtualBaseConstructor.instantiateWrapperFor(VirtualBaseConstructor.java:102) 
    at sun.jvm.hotspot.oops.Metadata.instantiateWrapperFor(Metadata.java:68) 
    at sun.jvm.hotspot.memory.DictionaryEntry.klass(DictionaryEntry.java:71) 
    at sun.jvm.hotspot.memory.Dictionary.classesDo(Dictionary.java:66) 
    at sun.jvm.hotspot.memory.SystemDictionary.classesDo(SystemDictionary.java:190) 
    at sun.jvm.hotspot.memory.SystemDictionary.allClassesDo(SystemDictionary.java:183) 
    at sun.jvm.hotspot.utilities.HeapHprofBinWriter.writeClasses(HeapHprofBinWriter.java:942) 
    at sun.jvm.hotspot.utilities.HeapHprofBinWriter.write(HeapHprofBinWriter.java:427) 
    at sun.jvm.hotspot.tools.HeapDumper.run(HeapDumper.java:62) 
    at sun.jvm.hotspot.tools.Tool.startInternal(Tool.java:260) 
    at sun.jvm.hotspot.tools.Tool.start(Tool.java:223) 
    at sun.jvm.hotspot.tools.Tool.execute(Tool.java:118) 
    at sun.jvm.hotspot.tools.HeapDumper.main(HeapDumper.java:83) 
    ... 6 more 

環境:CentOS的64位,爪哇OpenJDK的運行時環境(建立1.8.0_31-B13)的OpenJDK 64位服務器VM(建立25.31-B07,混合模式)

Usign ps看到的java版本用於:

/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.31-1.b13.el6_6.x86_64/jre/bin/java 

我的第一個嘗試是:

/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.31-1.b13.el6_6.x86_64/bin/jmap -dump:format=b,file=dump.bin 14984 

這讓我:

14984: 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選項

/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.31-1.b13.el6_6.x86_64/bin/jmap -F -dump:format=b,file=dump.bin 14984 
+1

你確定你使用的是Java的同一版本,他們是兩個64位?並用相同的用戶運行它? – biziclop

+0

也許與https://bugs.launchpad.net/ubuntu/+source/openjdk-6/+bug/1417962 – RobAu

回答

15

好吧,我發現它。

我運行jmap命令爲root,但我必須以啓動java進程的用戶身份運行。

在我的情況:

sudo -u robau ./jmap -dump:format=b,file=/tmp/dump.bin 14984 

似乎與這個JDK錯誤: https://bugs.openjdk.java.net/browse/JDK-8075773

+1

相關有一個很好的內置堆文件分析器jhat /tmp/dump.bin,它將分析堆轉儲文件並在端口7000上公開結果 –

6

我作爲啓動該進程的用戶運行,即使對CentOS的這個問題。我解決這個問題的方法是安裝與提供jmap實用程序的包相對應的debuginfo包。

要安裝debuginfo軟件包,請參見this answer(用您的java軟件包代替glibc)。它需要獲取/使用debuginfo-install實用程序,並確保CentOS-Debuginfo.repo已正確設置並啓用。

+0

CentOS 7也存在同樣的問題。我從http://debuginfo.centos.org/7/x86_64/下載了軟件包,並使用'rpm -ivh java-1.8.0-openjdk-debuginfo * .rpm'手動安裝。謝謝! – xonya

8

我遇到了同樣的問題,試圖在AWS ElasticBeanstalk實例上運行jmap。該固定的命令是

sudo debuginfo-install java-1.8.0-openjdk-devel

BTW,JMAP上安裝了AWS ElasticBeanstalk實例與命令

sudo yum install java-1.8.0-openjdk-devel-1.8.0.91-0.b14.10.amzn1.x86_64