我们在Linux 32位(CentOS)上运行Sun JRE 6u20上的JAVA服务器.我们将Server Hotspot与CMS收集器一起使用,并使用以下选项(我只提供了相关的选项):
-Xmx896m -Xss128k -XX:NewSize=384M -XX:MaxPermSize=96m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC
Run Code Online (Sandbox Code Playgroud)
有时,在运行一段时间后,JVM似乎陷入挂起状态,即使我们没有向应用程序发出任何请求,CPU也继续以100%旋转(我们有8个逻辑CPU,所以看起来就像只有一个CPU一样旋转).在这种状态下,JVM不响应SIGHUP信号(kill -3),我们无法通过jstack正常连接它.我们可以用"jstack -F"连接,但输出很狡猾(我们可以看到很多来自JStack的NullPointerExceptions显然是因为它无法"走"某些堆栈).所以"jstack -F"输出似乎没用.
我们已经从"gdb"运行了堆栈转储,并且我们能够匹配旋转CPU的线程ID(我们发现使用"top"和每个线程视图 - "H"选项)并且线程堆栈出现在gdb结果中,它是这样的:
Thread 443 (Thread 0x7e5b90 (LWP 26310)):
#0 0x0115ebd3 in CompactibleFreeListSpace::block_size(HeapWord const*) const () from /usr/java/jdk1.6.0_20/jre/lib/i386/server/libjvm.so
#1 0x01160ff9 in CompactibleFreeListSpace::prepare_for_compaction(CompactPoint*) () from /usr/java/jdk1.6.0_20/jre/lib/i386/server/libjvm.so
#2 0x0123456c in Generation::prepare_for_compaction(CompactPoint*) () from /usr/java/jdk1.6.0_20/jre/lib/i386/server/libjvm.so
#3 0x01229b2c in GenCollectedHeap::prepare_for_compaction() () from /usr/java/jdk1.6.0_20/jre/lib/i386/server/libjvm.so
#4 0x0122a7fc in GenMarkSweep::invoke_at_safepoint(int, ReferenceProcessor*, bool) () from /usr/java/jdk1.6.0_20/jre/lib/i386/server/libjvm.so
#5 0x01186024 in CMSCollector::do_compaction_work(bool) () from /usr/java/jdk1.6.0_20/jre/lib/i386/server/libjvm.so
#6 0x011859ee in CMSCollector::acquire_control_and_collect(bool, bool) () from /usr/java/jdk1.6.0_20/jre/lib/i386/server/libjvm.so
#7 0x01185705 …Run Code Online (Sandbox Code Playgroud) java ×1