我有一个生产系统,JBoss应用服务器运行在JDK 1.6.0_24,JBoss 4.3上。 时不时地,服务器崩溃,JVM创建的转储文件具有一致的结果:
{Heap before GC invocations=6421 (full 4675):
PSYoungGen total 521536K, used 518784K [0xdbc00000, 0xfbc00000, 0xfbc00000)
eden space 518784K, 100% used [0xdbc00000,0xfb6a0000,0xfb6a0000)
from space 2752K, 0% used [0xfb950000,0xfb950000,0xfbc00000)
to space 2752K, 0% used [0xfb6a0000,0xfb6a0000,0xfb950000)
PSOldGen total 1572864K, used 1572855K [0x7bc00000, 0xdbc00000, 0xdbc00000)
object space 1572864K, 99% used [0x7bc00000,0xdbbfdeb8,0xdbc00000)
PSPermGen total 524288K, used 92683K [0x5bc00000, 0x7bc00000, 0x7bc00000)
object space 524288K, 17% used [0x5bc00000,0x61682c30,0x7bc00000)
81507.318: [Full GC [PSYoungGen: 518784K->518784K(521536K)] [PSOldGen: 1572855K->1572855K(1572864K)] 2091639K->2091639K(2094400K) [PSPermGen: 92683K->92683K(524288K)], 1.5334976 secs] [Times: user=1.53 sys=0.00, real=1.53 secs]
Heap after GC invocations=6421 (full 4675):
PSYoungGen total 521536K, used 518784K [0xdbc00000, 0xfbc00000, 0xfbc00000)
eden space 518784K, 100% used [0xdbc00000,0xfb6a0000,0xfb6a0000)
from space 2752K, 0% used [0xfb950000,0xfb950000,0xfbc00000)
to space 2752K, 0% used [0xfb6a0000,0xfb6a0000,0xfb950000)
PSOldGen total 1572864K, used 1572855K [0x7bc00000, 0xdbc00000, 0xdbc00000)
object space 1572864K, 99% used [0x7bc00000,0xdbbfdeb8,0xdbc00000)
PSPermGen total 524288K, used 92683K [0x5bc00000, 0x7bc00000, 0x7bc00000)
object space 524288K, 17% used [0x5bc00000,0x61682c30,0x7bc00000)
}
对于JAVA_OPTS,我们得到了:
-server
-Xms2048m
-Xmx2048m
-Dsun.rmi.dgc.client.gcInterval = 3600000
-Dsun.rmi.dgc.server.gcInterval = 3600000
-Dsun.lang.ClassLoader.allowArraySyntax = true
-XX:NewSize = 512m
-XX:MaxNewSize = 512m
-XX:PermSize = 512m
-XX:MaxPermSize = 512m
-verbosegc
-XX:+ PrintGCDetails
-XX:+ PrintGCTimeStamps
-XX:+ PrintHeapAtGC
-XX:+ CMSPermGenSweepingEnabled
-XX:-TraceClassLoading
-XX:-TraceClassUnloading
所以在我看来,2GB就足够了,可以使用更多的内存,所以应该没有任何问题。
有什么建议吗?
答案 0 :(得分:2)
你内存不足。你将堆大小设置为2G,年轻代为500M,老一代为1500M,填充它可以使用的最大2G(你的幸存空间是空的但很低,它们可能太低而无法从Eden空间获得任何对象。
您应该尝试增加最大堆大小,如果仍有问题,则需要监视内存使用情况以检查是否有任何泄漏或某些进程请求过多的新对象,而内存使用率已经很高
答案 1 :(得分:0)
增加你的Xmx值。伊甸园空间物体无处可以在100%左右溢出OldGen。
考虑使用JConsole之类的东西附加到违规应用程序的PID并监视JVM内存使用情况。这将有助于确定与JBoss的某些交互是否会导致堆耗尽,或者内存泄漏是否缓慢。