有没有办法解决这种错误报告:
# 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 日志显示内存使用量低的瞬间有一些崩溃)。在模式下运行时不会发生崩溃-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
.