带有 jmap 的堆转储抛出 NullPointerException
Heap dump with jmap throws NullPointerException
我正在尝试使用 jmap 进行堆转储,但我一直收到 NPE。
我正在使用 Oracle 的 Java7 jdk(详情如下)。
$sudo jmap -F -dump:format=b,file=heap.bin 21966
Attaching to process ID 21966, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.71-b01
Attaching to process ID 21966, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.71-b01
Dumping heap to /tmp/dumps/2015-02-18T13:24:36Z-heap.bin ...
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: java.lang.NullPointerException
at sun.jvm.hotspot.utilities.HeapHprofBinWriter.writeSymbolID(HeapHprofBinWriter.java:905)
at sun.jvm.hotspot.utilities.HeapHprofBinWriter.writeFieldDescriptors(HeapHprofBinWriter.java:743)
at sun.jvm.hotspot.utilities.HeapHprofBinWriter.writeClassDumpRecord(HeapHprofBinWriter.java:511)
at sun.jvm.hotspot.utilities.HeapHprofBinWriter.access[=10=]0(HeapHprofBinWriter.java:297)
at sun.jvm.hotspot.utilities.HeapHprofBinWriter.visit(HeapHprofBinWriter.java:446)
at sun.jvm.hotspot.memory.SystemDictionary.visit(SystemDictionary.java:179)
at sun.jvm.hotspot.memory.Dictionary.classesDo(Dictionary.java:69)
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.writeClassDumpRecords(HeapHprofBinWriter.java:443)
at sun.jvm.hotspot.utilities.HeapHprofBinWriter.write(HeapHprofBinWriter.java:413)
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)
$java -version
java version "1.7.0_71"
Java(TM) SE Runtime Environment (build 1.7.0_71-b14)
Java HotSpot(TM) 64-Bit Server VM (build 24.71-b01, mixed mode)
有人以前看过这个吗?谷歌搜索提出了 OpenJDK (https://bugs.openjdk.java.net/browse/JDK-8028623) 的问题
但我不确定 Oracle JDK 是否有同样的问题。
是的,您找到了完全相同问题的正确 link。
它已在 JDK 7u72.
中修复
顺便说一句,-F
选项使 jmap
以完全不同的方式工作。
- 没有
-F
jmap 使用 Dynamic Attach mechanism 连接到目标 JVM,然后要求 JVM 从 JVM 进程中自行生成转储;
- with
-F
jmap 使用Serviceability Agent 挂起目标 JVM 进程,然后远程读取其内存,在单独的进程中完成所有工作。虽然 SA 是一个很酷且功能强大的工具,但它并没有得到很好的维护以与最新的 JVM 实现细节 100% 兼容。因此,遇到 SA 问题并不少见。
我正在尝试使用 jmap 进行堆转储,但我一直收到 NPE。 我正在使用 Oracle 的 Java7 jdk(详情如下)。
$sudo jmap -F -dump:format=b,file=heap.bin 21966
Attaching to process ID 21966, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.71-b01
Attaching to process ID 21966, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.71-b01
Dumping heap to /tmp/dumps/2015-02-18T13:24:36Z-heap.bin ...
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: java.lang.NullPointerException
at sun.jvm.hotspot.utilities.HeapHprofBinWriter.writeSymbolID(HeapHprofBinWriter.java:905)
at sun.jvm.hotspot.utilities.HeapHprofBinWriter.writeFieldDescriptors(HeapHprofBinWriter.java:743)
at sun.jvm.hotspot.utilities.HeapHprofBinWriter.writeClassDumpRecord(HeapHprofBinWriter.java:511)
at sun.jvm.hotspot.utilities.HeapHprofBinWriter.access[=10=]0(HeapHprofBinWriter.java:297)
at sun.jvm.hotspot.utilities.HeapHprofBinWriter.visit(HeapHprofBinWriter.java:446)
at sun.jvm.hotspot.memory.SystemDictionary.visit(SystemDictionary.java:179)
at sun.jvm.hotspot.memory.Dictionary.classesDo(Dictionary.java:69)
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.writeClassDumpRecords(HeapHprofBinWriter.java:443)
at sun.jvm.hotspot.utilities.HeapHprofBinWriter.write(HeapHprofBinWriter.java:413)
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)
$java -version
java version "1.7.0_71"
Java(TM) SE Runtime Environment (build 1.7.0_71-b14)
Java HotSpot(TM) 64-Bit Server VM (build 24.71-b01, mixed mode)
有人以前看过这个吗?谷歌搜索提出了 OpenJDK (https://bugs.openjdk.java.net/browse/JDK-8028623) 的问题 但我不确定 Oracle JDK 是否有同样的问题。
是的,您找到了完全相同问题的正确 link。
它已在 JDK 7u72.
顺便说一句,-F
选项使 jmap
以完全不同的方式工作。
- 没有
-F
jmap 使用 Dynamic Attach mechanism 连接到目标 JVM,然后要求 JVM 从 JVM 进程中自行生成转储; - with
-F
jmap 使用Serviceability Agent 挂起目标 JVM 进程,然后远程读取其内存,在单独的进程中完成所有工作。虽然 SA 是一个很酷且功能强大的工具,但它并没有得到很好的维护以与最新的 JVM 实现细节 100% 兼容。因此,遇到 SA 问题并不少见。