当尝试从正在运行的Java进程中进行堆转储时,得到了此Stacktrace。是什么原因造成的,我该怎么做才能进行适当的堆转储?
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位,Java OpenJDK运行时环境(内部版本1.8.0_31-b13)OpenJDK
64位服务器VM(内部版本25.31-b07,混合模式)
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
好的,我找到了。
我以jmap
身份运行命令root
,但是我必须以启动Java进程的用户身份运行。
就我而言:
sudo -u robau ./jmap -dump:format=b,file=/tmp/dump.bin 14984
似乎与此JDK错误有关:https :
//bugs.openjdk.java.net/browse/JDK-8075773
Eclipse Memory Analyser文档称它可以打开IBM便携堆转储文件(*.phd):
我有一个非常奇怪的问题。我有一个30 GB的堆转储,我想在我的笔记本电脑上分析相同的(它有8 GB的内存)。我试着用MAT和IBM堆分析器这样做,但是根据他们的建议,Xmx大小应该超过转储大小。我也试着用MAT的文件分析堆转储,但是收到内存错误。 关于如何成功分析笔记本电脑上的垃圾,有什么建议吗? 提前谢谢!
问题内容: 我有一个这样的数组声明: 这是原始类型的数组。该数组存储在哪里?它存储在堆还是堆栈上?这是一个原始类型,所有原始类型都不存储在堆上。 问题答案: 正如gurukulki所说,它存储在堆中。但是,你的帖子提出了一个误解,可能是由于一些善意的人传播了“原始生物始终存在”的神话。这是不正确的。局部变量在堆栈上有其值,但并非所有原始变量都是局部的… 例如,考虑一下: 现在,住在哪里?神话暗示它
我在我的Github帐户上有一个存储库,我从官方存储库中派生了这个存储库。 然后我在我的本地机器上克隆了它。它工作得很好。我创建了几个分支(在分支下)。我做了几次提交,它工作得很好。 当我这样做时,我不知道我是如何得到以下错误的: 如何在不影响Github上的存储库的情况下解决此错误? 我正在使用 我的<代码>的内容。git/config在执行cat$(git rev parse-show top
这个问题类似于,但不同于关于三值运算符的另一个问题。在这个问题中,空整数必须强制为int,因为函数的返回值是int。然而,在我学生的代码中却不是这样。 这段代码运行良好: x的值为NULL。没有NPE。在这种情况下,编译器可以发现三进制运算符的结果需要是整数,因此它将3(一个int)转换为整数,而不是将null转换为int。
我正在经历内存泄漏,这里有一些细节。 在泄漏后, null null 我很惊讶顶部、堆转储大小和实际堆大小之间的差异。我猜测top和heap之间的区别是垃圾收集器堆和本地堆区域的可能性。但是,为什么堆转储文件大小和实际堆大小(来自eclipse MAT analyzer)会不同呢? 对这个问题有什么见解吗? 更新/回答 一些建议是使用jcmd(https://docs.oracle.com/jav