虽然有大量的内存,JBoss会抛出一些内存

时间:2012-01-09 19:23:26

标签: java out-of-memory

当用户尝试登录时,JBoss会抛出OOME,尽管有大量的内存! JBoss使用以下设置已经持续了大约55个小时:

-Xms1024m
-Xmx1536m
-XX:MaxPermSize=256m
-Dsun.rmi.dgc.client.gcInterval=3600000
-Dsun.rmi.dgc.server.gcInterval=3600000
-Xss256k
-XX:+UseConcMarkSweepGC
-XX:+CMSClassUnloadingEnabled
-XX:HeapDumpPath=../heapdump.hprof
-XX:+HeapDumpOnOutOfMemoryError
-Djava.net.preferIPv4Stack=true

根据JVisualVm,​​使用的内存大约为950M。这意味着仍有超过500M的可用于分配。但是,所有登录尝试都会导致“java.lang.OutOfMemoryError:Java堆空间”!

2 个答案:

答案 0 :(得分:1)

登录时,实例化资源可能超过可用/已分配内存的可能性很高。我建议对登录进行线程转储分析,这可能会为您提供更多信息。这是关于如何进行线程转储分析的SO链接。 Thread dump analysis on jboss

我会在登录时检查JVisualVM显示的确切值。你为VisualVM显示选择了Jboss进程吗?

答案 1 :(得分:1)

如果绑定将对象放入由于某种原因无法重新调整大小的空间,则可能会耗尽内存。例如大型物体直接添加到旧的gen空间。如果旧的gen空间已满,但是eden或幸存者空间不够满,则可以获得Out of heap空间。

如果您使用并发标记扫描收集器,则可以使用碎片化的旧代内存。这是因为这一代不会解体。例如假设您每使用1 KB并且每秒都有空,您可以释放50%的内存,但将2 KB对象移动到旧版可能会失败。

如果你在旧版本中遇到很多碎片,我会建议增加新一代的尺寸。这应该减少进入旧gen的中等对象的数量,当它被释放时导致碎片化。

另一种不太可能的方法是你试图创建一个600MB的对象。这失败了,使用的内存永远不会超过950 MB。