我们正在运行一个带有JNI层的Java 8应用程序,该层由于C层中的某处出现内存不足错误而崩溃。
与通常的hs_err_pid.log文件一起,我们注意到这次我们还收到了replay_pid.log文件。我已经完成了一些广泛的google-foo,几乎找不到有关此文件的任何内容。
之前有没有人见过这个文件,有没有人知道它包含什么以及如何最好地分析它?
答案 0 :(得分:4)
该文件由java热点生成,以提供有关发生问题时的操作的重播信息。它是否能为您提供足够的信息来告诉您问题出在何处,但它确实有助于告诉您当时的情况。
在OpenJDK下报告了一个类似的问题,关于在发生分段错误后生成的重放文件。据说这个问题是用以后的版本修复的,所以如果你使用的版本低于8u40,我会升级,看看是否能解决这个问题。 (issue as reported)
如果没有,那么你将不得不开始挖掘你的C / C ++文件,找出导致seg错误的原因。既然你正在使用JNI,那么要记住的一件事(如果你知道的话,请原谅我)是,如果你用Java通过JNI调用C / C ++然后在那个调用中,分配任何内存,那个内存分配当您的Java对象被垃圾回收时,不会释放。您必须手动释放分配的内存。如果一个函数对同一个C / C ++类进行多次调用,并且每次分配更多内存,那么最终你将最终遇到这个问题。
答案 1 :(得分:1)
数据格式似乎在ciReplay.cpp中“描述”,请参阅http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/file/849eb7bfceac/src/share/vm/ci/ciReplay.cpp。
开始阅读第389行(void process_command),您可以在其中查看哪些类型的数据以及解析的方式。
关于工具:有一种方法可以回读文件并使用该数据做一些有趣的事情,请参阅http://cr.openjdk.java.net/~minqi/6830717/raw_files/new/agent/doc/
引用:
使用HotSpot Serviceability Agent API的顶级GUI程序称为HSDB,即“HotSpot Debugger”。要运行它,请键入“hsdbproc.sh”或“hsdbwindbg.bat”或64位变体(分别在Unix,Windows平台上)。更多信息。在HSDB GUI上有hsdb.html。
代码在这里: http://hg.openjdk.java.net/hsx/hsx25/hotspot/file/0c94c41dcd70/agent/doc/cireplay.html和http://hg.openjdk.java.net/hsx/hsx25/hotspot/file/0c94c41dcd70/agent/doc
不幸的是,看起来我们还需要核心转储文件,而不仅仅是重播文件......