jdk6有问题的框架:#J java.util.LinkedHashMap.addEntry(ILjava / lang / Object; Ljava / lang / Object; I)V

时间:2012-10-21 11:46:59

标签: java jvm-crash

有没有办法解决此类错误报告:

# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x00007fc955e66998, pid=25851, tid=140467030525696
#
# JRE version: 6.0_37-b06
# Java VM: Java HotSpot(TM) 64-Bit Server VM (20.12-b01 mixed mode linux-amd64 compressed     oops)
# Problematic frame:
# J  java.util.LinkedHashMap.addEntry(ILjava/lang/Object;Ljava/lang/Object;I)V

崩溃频繁发生(在Web服务器生产中每天1-2次),几乎总是有不同的问题框架报告。

以下是一些错误报告的示例:

# J  java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.addConditionWaiter()Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;
# J  java.util.LinkedHashMap.addEntry(ILjava/lang/Object;Ljava/lang/Object;I)V
# C  [libc.so.6+0x6bb34]
# C  [libgobject-2.0.so.0+0x2346f]  g_type_check_instance_is_a+0x43
# C  [libgobject-2.0.so.0+0x2346f]  g_type_check_instance_is_a+0x43
# V  [libjvm.so+0x4d3360]
# V  [libjvm.so+0x32d166]  CardTableRS::write_ref_field_gc_par(void*, oopDesc*)+0x26
# V  [libjvm.so+0x7a33e2]  ContiguousSpace::prepare_for_compaction(CompactPoint*)+0x242
# V  [libjvm.so+0x4d3360]
# V  [libjvm.so+0x76943b]  ReferenceProcessor::balance_queues(DiscoveredList*)+0x32b
# V  [libjvm.so+0x4d3360]
# V  [libjvm.so+0x32d166]  CardTableRS::write_ref_field_gc_par(void*, oopDesc*)+0x26
# V  [libjvm.so+0x4d3360]
# V  [libjvm.so+0x4d3360]
# V  [libjvm.so+0x76943b]  ReferenceProcessor::balance_queues(DiscoveredList*)+0x32b

似乎唯一触发崩溃的事情是高内存使用量大约30gb,即使并非总是如此(在gc log显示内存使用率低的瞬间存在一些崩溃)。在-Xint模式下运行时不会发生崩溃,但该模式速度太慢,无法选择。

似乎很难制作任何简单的“可重现代码”来重现复杂应用程序的生产环境中发生的错误。

怎么办?我确实在Oracle崩溃站点上报告了一堆这些......

我不怀疑硬件内存问题,因为除了java之外别的什么都不会崩溃。并且应用程序中没有自定义本机jni代码。

我们的vm参数为-server -Xss4096k -Xms32255M -Xmx32255M -Xnoclassgc -XX:+UseNUMA -XX:MaxPermSize=512m -XX:+UseGCOverheadLimit -verbose:gc -Xmaxf1 -XX:+UseCompressedOops -XX:+DisableExplicitGC -XX:+AggressiveOpts -XX:+ScavengeBeforeFullGC -XX:CMSFullGCsBeforeCompaction=10 -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:+CMSIncrementalPacing -XX:+CMSParallelRemarkEnabled -XX:+ParallelRefProcEnabled -XX:GCTimeRatio=19 -XX:+UseAdaptiveSizePolicy -XX:MaxGCPauseMillis=500 -Xloggc:gc.log

4 个答案:

答案 0 :(得分:0)

虽然崩溃可能是由JVM错误引起的,但更有可能是由您编写的某些JNI / JNA本机代码引起的,或者是您正在使用的某些第三方库的一部分引起的

  

怎么办?

以下是关于如何开始调试崩溃转储主题的博客:http://www.javacodegeeks.com/2012/01/debugging-jvm.html

在您的情况下,报告各不相同的事实将使问题更难以追查。 听起来就像你可能会遇到“随机”破坏堆对象的问题。

  

我确实在Oracle崩溃站点报告了一堆这些......但是...

除非您有支持合同,否则Oracle不太可能通过解决方案回复您。

答案 1 :(得分:0)

如果崩溃是频繁出现的明显随机原因,那么我会考虑可能的硬件问题(例如狡猾的RAM)。我倾向于在服务器上运行一整套硬件诊断程序,看看是否会抛出任何东西。

答案 2 :(得分:0)

我在Web上发现了这篇文章`如果您将Java™虚拟机(JVM)AggressiveOpts选项与包含Enterprise JavaBeans(EJB)文件的Java平台企业版(Java EE)应用程序一起使用,则JVM可能会崩溃。要解决此问题,请使用以下参数禁用DoEscapeAnalysis优化:

-XX:+ AggressiveOpts -XX:-DoEscapeAnalysis`:

http://www-01.ibm.com/support/docview.wss?uid=swg21422605

奇怪的是,-XX:-CMSIncrementalMode使系统非常不稳定,我必须启用此选项。

答案 3 :(得分:0)

升级到jdk7 Java(TM)SE运行时环境(版本1.7.0_09-b05)并且之后没有任何问题;跟随vmargs:

-server -Xss4096k -XX:MaxPermSize=512m -Xms32255M -Xmx32255M -Xnoclassgc -XX:+UseNUMA -XX:+UseBiasedLocking -XX:+UseFastAccessorMethods -XX:ReservedCodeCacheSize=48m -XX:+UseStringCache -XX:+HeapDumpOnOutOfMemoryError -XX:+UseGCOverheadLimit -Duser.timezone=EET -Xmaxf1 -XX:+UseCompressedOops -XX:+DisableExplicitGC -XX:+AggressiveOpts -XX:CMSInitiatingOccupancyFraction=70 -XX:+ParallelRefProcEnabled -XX:+UseAdaptiveSizePolicy -XX:MaxGCPauseMillis=100 -XX:+UseG1GC -XX:GCPauseIntervalMillis=3000 -XX:+PrintGCDetails -XX:+PrintHeapAtGC -Xloggc:gc.log