我正在Glassfish V2.1 6示例集群配置(SLES 10 SP 4,64位Suse Linux计算机,具有19 Gb RAM)中运行一个大型企业应用程序,DAS计算机server.log显示一些“java.lang.OutOfMemoryError:Java堆空间”错误。DAS的jvm.log中的堆使用情况报告显示:
Heap
PSYoungGen total 103488K, used 99840K [0x00002aab237c0000, 0x00002aab2a270000, 0x00002aab4e260000)
eden space 99840K, 100% used [0x00002aab237c0000,0x00002aab29940000,0x00002aab29940000)
from space 3648K, 0% used [0x00002aab29940000,0x00002aab29940000,0x00002aab29cd0000)
to space 4672K, 0% used [0x00002aab29de0000,0x00002aab29de0000,0x00002aab2a270000)
PSOldGen total 1398144K, used 1398143K [0x00002aaace260000, 0x00002aab237c0000, 0x00002aab237c0000)
object space 1398144K, 99% used [0x00002aaace260000,0x00002aab237bfe70,0x00002aab237c0000)
PSPermGen total 107200K, used 106931K [0x00002aaaae260000, 0x00002aaab4b10000, 0x00002aaace260000)
object space 107200K, 99% used [0x00002aaaae260000,0x00002aaab4accd98,0x00002aaab4b10000)
从上面我们得到的总堆空间为1.6Gb(103488 + 1398144 + 107200 = 1608832 ~ 1.6Gb),即使允许的最大堆空间设置为2Gb(-XX:MaxPermSize= 512 m-Xmx 2048 m)。为什么JVM在输出OOM错误之前不增加堆大小?我们如何解释上面的堆报告?我在一个二进制堆文件上运行MAT工具,得到了两个泄漏嫌疑犯:
Problem suspect #1
One instance of "com.sun.jmx.mbeanserver.JmxMBeanServer" loaded by "<system class loader>" occupies 522,351,680 (34.12%) bytes. The instance is referenced by org.jvnet.glassfish.comms.admin.management.extensions.config.OverloadProtectionServiceConfigImpl @ 0x2aaacfe74ed0 , loaded by "com.sun.appserv.server.util.ASURLClassLoader @ 0x2aaace7fc630". The memory is accumulated in one instance of "java.util.HashMap$Entry[]" loaded by "<system class loader>".
Keywords
java.util.HashMap$Entry[]
com.sun.appserv.server.util.ASURLClassLoader @ 0x2aaace7fc630
com.sun.jmx.mbeanserver.JmxMBeanServer
Problem suspect #2
140,421 instances of "net.jxta.impl.endpoint.tcp.TcpMessenger", loaded by "com.sun.appserv.server.util.ASURLClassLoader @ 0x2aaace7fc630" occupy 735,809,464 (48.07%) bytes. These instances are referenced from one instance of "java.util.TimerTask[]", loaded by "<system class loader>"
Keywords
java.util.TimerTask[]
com.sun.appserv.server.util.ASURLClassLoader @ 0x2aaace7fc630
net.jxta.impl.endpoint.tcp.TcpMessenger
不幸的是,错误发生在几周前,机器已经重新启动,所以我可能丢失了一些上下文信息。我正在寻找提示或解释,并试图防止这些错误。提前感谢任何帮助。
欢呼声
/山姆
1条答案
按热度按时间wlwcrazw1#
我的问题是:为什么JVM在输出OOM错误之前不增加堆的大小呢?
使用您设置的JVM选项(*-Xmx 2048 m ),最大堆空间将是2G,没错,但您没有设置 * 初始堆空间选项**-Xms 1024**。
此选项将告诉JVM最初为服务器提供1024 MB的堆空间,而不是在需要时缓慢增加。
这可以防止出现OOM错误,因为有时JVM没有注意到GC导致的某些内存更改。
请查看this来优化您的应用服务器。
关于您的MemLeaks:
很难判断这些是 * 真实的的 * 内存泄漏还是只是一些服务器类。
要检查这一点,您可以触发内存转储并使用MemoryAnalyser等进行分析
希望这对你有帮助,玩得开心!