使用jmap命令,您可以将核心转储文件转换为hprof文件格式,然后可以使用VisualVM和许多其他工具进行分析。我尝试过这样做,并收到了错误消息。这是我运行的命令(在发生崩溃的同一台机器上,使用相同的JVM):
jmap -dump:format=b,file=dump.hprof /usr/java/jdk1.6.0_16/bin/java core.dump.2878
整个响应如下:
> Attaching to core core.dump.8483 from executable /usr/java/jdk1.6.0_16/bin/java, please wait...
> Error attaching to core file: Can't attach to the core file
这不是一个非常有用的错误信息。我曾经想过可能是权限问题,但是以引起核心转储的JVM所使用的相同用户来运行命令时,我收到了相同的信息。我还怀疑核心文件是否已损坏,因此决定使用gdb
查看是否可以打开核心文件并查看其中的内容。以下是所得到的:
> gdb GNU gdb (GDB) Red Hat Enterprise Linux (7.0.1-37.el5_7.1) GPLv3+许可证:GNU GPL第3版或更高版本 这是自由软件:您可以更改和重新分发它。 在法律允许的范围内,没有保修。键入“show copying”和“show warranty”以获取详细信息。 此GDB配置为“x86_64-redhat-linux-gnu”。 有关错误报告说明,请参见: <http://www.gnu.org/software/gdb/bugs/>。 (gdb) core-file core.dump.8483 [新线程2889] [新线程2893] [新线程2894] [新线程2895] [新线程2896] [新线程2904] [新线程2915] [新线程2916] [新线程2917] [新线程2921] [新线程2922] [新线程3175] [新线程3239] [新线程3252] [新线程3258] [新线程3260] [新线程3356] [新线程3509] [新线程3510] [新线程3514] [新线程3523] [新线程3541] [新线程3542] [新线程3543] [新线程4022] [新线程4057] [新线程4058] [新线程4077] [新线程4078] [新线程4079] [新线程4080] [新线程6128] [新线程6140] [新线程6162] [新线程6376] [新线程6389] [新线程6408] [新线程6422] [新线程6429] [新线程6451] [新线程6497] [新线程6513] [新线程6514] [新线程6516] [新线程6517] [新线程6532] [新线程6533] [新线程6665] [新线程6675] [新线程6676] [新线程6687] [新线程6689] [新线程6692] [新线程6706] [新线程6707] [新线程6735] [新线程6736] [新线程7033] [新线程7034] [新线程7056] [新线程7077] [新线程7079] [新线程7080] [新线程7082] [新线程7089] [新线程7090] [新线程7091] [新线程7092] [新线程7103] [新线程7105] [新线程7107] [新线程7108] [新线程7116] [新线程7229] [新线程7308] [新线程7493] [新线程7505] [新线程7510] [新线程7511] [新线程7517] [新线程7523] [新线程7604] [新线程7617] [新线程7618] [新线程7619] [新线程8676] [新线程8693] [新线程8700] [新线程8851] [新线程8860] [新线程8887] [新线程9007] [新线程9118] [新线程9119] [新线程9120] [新线程9413] [新线程9427] [新线程9495] [新线程9508] [新线程9519] [新线程9535] [新线程9536] [新线程9537] [新线程9554] [新线程9556] [新线程9659] [新线程9660] [新线程9663] [新线程9664] [新线程9665] [新线程9666] [新线程9667] [新线程9668] [新线程9669] [新线程9670] [新线程9671] [新线程9678] [新线程9870] [新线程9953] [新线程9998] [新
在那一刻,我放弃了,因为我对和如何使用它来诊断这种问题一无所知。我甚至不太理解最后一个命令到底做了什么。值得注意的一件事是,在输出中正好有134个“New Thread”行,如果每个线程都代表JVM中新生成的一个线程,那么这可能就是JVM死亡的原因。
所以我的问题实际上有三个方面 -
1)您是否知道为什么命令会出现错误消息?
2)您是否知道输出的含义?
3)您是否知道如何使用进一步诊断此问题?
ps -ef
并查看应用程序使用的 JVM 得出的。 - Jon