java Centos 64 位和 openjdk 7 上的堆转储错误
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/16587460/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Heap dump error on Centos 64bit and openjdk 7
提问by ufasoli
I'm trying to generate a heap dump on my machine that is running a glassfish 3.1.2 using a open-jdk7 java.
我正在尝试使用 open-jdk7 java 在运行 glassfish 3.1.2 的机器上生成堆转储。
I'm using the following command :
我正在使用以下命令:
jmap -dump:live,format=b,file=dump.t -F 24935
But I keep getting this error :
但我不断收到此错误:
Attaching to process ID 24935, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 23.7-b01
Dumping heap to dump.t ...
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:601)
at sun.tools.jmap.JMap.runTool(JMap.java:197)
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
Here is my full java version :
这是我的完整 Java 版本:
[ufasoli]$ java -version
java version "1.7.0_19"
OpenJDK Runtime Environment (rhel-2.3.9.1.el6_4-x86_64)
OpenJDK 64-Bit Server VM (build 23.7-b01, mixed mode)
The exact CentOS version is :
确切的 CentOS 版本是:
CentOS release 6.3 (Final)
Any ideas?
有任何想法吗?
采纳答案by joe-mig
Posting this so I dont keep forgetting the solution myself :P
发布这个,所以我不会自己忘记解决方案:P
This works:
这有效:
$ sudo /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.51.x86_64/bin/jmap -dump:format=b,file=./testDump 8894
Dumping heap to /home/<snip>/testDump ...
Heap dump file created
This fails:
这失败了:
$ sudo /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.51.x86_64/bin/jmap -heap:format=b 8894
Attaching to process ID 8894, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.45-b08
Dumping heap to 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: 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:604)
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
回答by kittylyst
This may be related, but on some Java versions, there seems to be a slight oddity on recent RHEL / Centos (version >= 6) whereby jmap, jstack and friends need to be run as the exactuser that started the process - and it will not work if run as root.
这可能是相关的,但在某些 Java 版本上,最近的 RHEL/Centos(版本 >=6)似乎有点奇怪,jmap、jstack 和朋友需要作为启动该过程的确切用户运行- 并且它如果以 root 身份运行将无法工作。
A command like:
像这样的命令:
sudo -H -u <USERNAME WHO STARTED PROCESS> jmap -histo <PID>
should take care of it, assuming you have appropriate sudo privileges.
应该照顾它,假设您有适当的 sudo 权限。
回答by LaSombra
Try running without the -F option
尝试在没有 -F 选项的情况下运行
回答by rogerdpack
According to http://iamadevops.tumblr.com/post/109281462774/howto-fix-jmap-f-dump-format-b-on-archlinuxthe solution is to "recompile your java with the debug symbols not stripped out" yikes.
根据http://iamadevops.tumblr.com/post/109281462774/howto-fix-jmap-f-dump-format-b-on-archlinux,解决方案是“使用未剥离的调试符号重新编译您的 java” yikes .
回答by Zsolt Katona
If you don't have the option to recompile the code with debug symbols and you have JMX configured, then you may try to generate a heapdump with VisualVM.
如果您没有使用调试符号重新编译代码的选项并且您配置了 JMX,那么您可以尝试使用 VisualVM 生成堆转储。
For this, start VisualVM and connect to the host via JMX. On the topleft of the monitor panel, you'll see a "Head Dump" button.
为此,启动 VisualVM 并通过 JMX 连接到主机。在监视器面板的左上角,您会看到一个“Head Dump”按钮。
The format is the dump file will be different, but you'll be able to open it with jhat or VisualVM.
转储文件的格式会有所不同,但您可以使用 jhat 或 VisualVM 打开它。
回答by Dave Rager
jmap
and jstack
do need debug symbols. Fortunately, you may not need to recompile your java.
jmap
并且jstack
确实需要调试符号。幸运的是,您可能不需要重新编译您的 java.lang.
For Ubuntu:
对于 Ubuntu:
# apt-get install openjdk-7-dbg
If someone has the command for CentOS, please edit this answer with it.
如果有人拥有 CentOS 的命令,请用它编辑此答案。
https://bugzilla.redhat.com/show_bug.cgi?id=1010786#c15
https://bugzilla.redhat.com/show_bug.cgi?id=1010786#c15
After that this worked for me.
之后这对我有用。
# jmap -dump:live,file=dump -F 11316