我的应用程序正在生产中获得现金。 崩溃转储表明在GCTaskThread
中发生了SIGSEGV它使用JNI,因此可能存在一些内存损坏的来源,尽管我无法确定。
我如何调试此问题 - 我做了-XX:OnError ...但我不确定什么可以帮助我调试它。
另外,你们中有些人可以举一个具体的例子来说明JNI代码如何使用SIGSEGV崩溃GC
修改:
操作系统:SUSE Linux Enterprise Server 10(x86_64)
vm_info:用于linux-amd64 JRE(1.6.0_10-b33)的Java HotSpot(TM)64位服务器VM(11.0-b15),由“java_re”与gcc 3.2于2008年9月26日01:10:29构建.2(SuSE Linux)
修改: 在我们禁用超线程之后问题停止了,有什么想法吗?
答案 0 :(得分:2)
JNI代码中的错误可以通过多种方式发生:
The program crashes during execution of a native method (most common).
The program crashes some time after returning from the native method, often during GC (not so common).
Bad JNI code causes deadlocks shortly after returning from a native method (occasional).
如果您认为用户编写的本机代码与JVM之间的交互存在问题(即JNI问题),则可以运行诊断程序来帮助您检查JNI转换。调用这些诊断;在启动JVM时指定-Xcheck:jni选项。
-Xcheck:jni选项激活JNI函数周围的一组包装函数。包装函数执行对传入参数的检查。这些检查包括:
Whether the call and the call that initialized JNI are on the same thread.
Whether the object parameters are valid objects.
Whether local or global references refer to valid objects.
Whether the type of a field matches the Get<Type>Field or Set<Type>Field call.
Whether static and nonstatic field IDs are valid.
Whether strings are valid and non-null.
Whether array elements are non-null.
The types on array elements.
请阅读以下链接 http://publib.boulder.ibm.com/infocenter/javasdk/v5r0/index.jsp?topic=/com.ibm.java.doc.diagnostics.50/html/jni_debug.html http://www.oracle.com/technetwork/java/javase/clopts-139448.html#gbmtq
答案 1 :(得分:1)
使用valgrind。这听起来像是内存损坏。输出将是详细的,但如果可能的话,尝试将报告隔离到JNI库。
答案 2 :(得分:0)
由于错误的线程似乎是GCTaskThread,你是否尝试启用verbose:gc
并分析输出(最好使用像武士这样的图形工具等)?您是否能够在检查hs_err文件后隔离特定的lib?
另外,您能否提供更多有关问题原因以及是否易于复制的信息?