JBoss抛出内存不足异常,尽管有大量可用内存。

3

当用户尝试登录时,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堆空间”!


在登录过程中,它是否可以调用一个堆设置更低的单独进程? - Kelly S. French
去掉“-Xss256k”,我敢打赌你的错误就会消失。 - Joe
2个回答

1

登录时,实例化的资源可能超过可用/分配的内存,这种情况很有可能发生。我建议进行线程转储分析以获取更多信息。以下是如何进行线程转储分析的SO链接。在jboss上进行线程转储分析

我会检查登录尝试时JVisualVM显示的确切值。您是否选择了VisualVM显示的Jboss进程?


1

如果尝试将对象放置到无法调整大小的空间中,可能会耗尽内存。例如,大型对象直接添加到旧代空间中。如果旧代空间已满,但伊甸园或幸存者空间并未完全填满,则会出现堆空间不足的情况。

如果您正在使用并发标记扫描收集器,则可能会出现分散的旧一代内存。这是因为该代没有进行碎片整理。例如,假设每1KB被使用并且每秒钟有一个空闲,即使可以拥有50%的空闲内存,将2KB对象移到旧一代也可能失败。

如果旧一代中出现了很多碎片,请增加新一代的大小。这应该减少中期对象进入旧一代的数量,从而在释放时导致碎片。

另一个不太可能的可能性是您正在尝试创建一个600MB的对象。这将失败,使用的内存永远不需要超过950 MB。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接