有没有办法解决此类错误报告:
# 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
。
答案 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