提问人:mhdwrk 提问时间:1/10/2012 更新时间:1/10/2012 访问量:506
JBoss 抛出内存不足,尽管有大量的内存
JBoss throws outofmemory though there's tons 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 heap space”!
答:
1赞
kosa
1/10/2012
#1
登录时,实例化的资源可能超过可用/分配的内存的可能性很高。我建议对登录进行线程转储分析,这可能会为您提供更多信息。这是关于如何进行线程转储分析的 SO 链接。jboss 上的线程转储分析
我会在登录尝试时检查JVisualVM显示多少确切值。你选择Jboss进程来显示VisualVM吗?
1赞
Peter Lawrey
1/10/2012
#2
如果将对象放入由于某种原因无法调整大小的空间中,则内存可能会耗尽。例如,大型对象被直接添加到旧的生成空间中。如果旧的生成空间已满,但 eden 或幸存者空间尚未完全满,则可以获得堆外空间。
如果使用的是并发标记扫描收集器,则可能会有碎片的旧一代内存。这是因为这一代没有碎片整理。例如,假设您每 1 KB 使用一次,每秒可用一次,您可以有 50% 的可用内存,但将 2 KB 对象移动到旧一代可能会失败。
如果你在老一代中有很多碎片化,我建议增加你的新一代的规模。这应该会减少进入旧世代的中等对象的数量,从而在释放时导致碎片化。
另一种不太可能的可能性是您正在尝试创建一个 600MB 的对象。此操作失败,使用的内存永远不需要超过 950 MB。
评论
-Xss256k