PS旧Gen内存在堆内存使用情况:Java内存不足异常的GC设置
以下是我的JVM设置:PS旧Gen内存在堆内存使用情况:Java内存不足异常的GC设置,java,jboss,garbage-collection,jvm,jvm-arguments,Java,Jboss,Garbage Collection,Jvm,Jvm Arguments,以下是我的JVM设置: JAVA_OPTS=-server -Xms2G -Xmx2G -XX:MaxPermSize=512M -Dsun.rmi.dgc.client.gcInterval=1200000 -Dsun.rmi.dgc.server.gcInterval=1200000 -XX:+UseParallelOldGC -XX:ParallelGCThreads=2 -XX:+UseCompressedOops -Djava.net.preferIPv4Stack=true -D
JAVA_OPTS=-server -Xms2G -Xmx2G -XX:MaxPermSize=512M -Dsun.rmi.dgc.client.gcInterval=1200000 -Dsun.rmi.dgc.server.gcInterval=1200000 -XX:+UseParallelOldGC -XX:ParallelGCThreads=2 -XX:+UseCompressedOops -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jbos88,server=y,suspend=n
问题:
总堆内存:2GB
旧代:1.4GB(堆的2/3)
新一代:600MB(堆的1/3)
旧的Gen在内存中的增长超过其分配大小的70%,并且即使在100%即1.4GB的情况下也不会受到GC的影响。
你可以看到下面的图形,它的峰值永远不是GC,内存的下降是当它被迫从JConsole执行GC时。
这个问题最终会导致web服务器停机
我遗漏了什么或者错误地设置了JVM
提前谢谢你的帮助
更新我的问题:
在堆分析之后,有状态会话bean似乎是主要怀疑对象:
我们有状态会话bean,它持有由Hibernate协助的持久性逻辑。最终将调用GC,而旧的gen几乎从未被调用过(因为它非常慢)。 GC确实会运行,但它首先只会在新世代和幸存者世代上运行,它有一个完全不同的算法来清理旧世代,比新世代/幸存者世代慢 这些数字真的很高,与新一代相比,老一代永远不会达到一个高数字。 我猜你有内存泄漏
我只能猜测您的程序正在处理大文件,您可能将对它们的引用保存得太长了。有状态会话bean导致JVM内存不足。
使用@Remove annotation显式处理它们解决了此问题。即使主要问题(内存泄漏)仍然得到解决,如果您仍然希望在频繁的小规模暂停中清除旧的gen,您可以尝试设置
-XX:MaxGCPauseMillis=(time in millis)
这仅适用于并行收集器和启用自适应大小调整策略时。默认情况下,“自适应大小调整策略”处于启用状态,但是,如果您想明确提到这一点,可以使用
-XX:+UseAdaptiveSizePolicy
或者,您可以切换到CMS收集器,在那里您可以使用
-XX:CMSInitiatingOccupancyFraction=(% value)
-XX:+UseCMSInitiatingOccupancyOnly
当旧版本达到旧版本的某一部分时,哪一种收集旧版本的方法更可靠。您是否看到JVM终止时使用
OutOfMemoryError堆空间
?或者您希望旧代GC更早运行?我尝试了这些JVM参数,很明显GC无法释放旧代空间,每次都试图永远释放内存,几乎无法恢复任何内存。如果在完全GC后内存没有明显恢复,那么旧代中的内容就不是垃圾。在这种情况下,这可能是应用程序的内存占用。如果是,则应该考虑增加分配的总内存。假设有状态会话bean是内存的主要占用者,我想说内存足迹大约等于(创建新会话的速率*会话超时*会话的平均大小)为什么不在执行优化(@Remove annotation)后共享另一个堆分析?这样我就能更好地了解情况了。我希望看到jmap-histo:live的输出在对会话bean进行更改后附加到jconsole上…在会话bean中它下降到0MB的那一个请忽略我已经重新启动了服务器…您是如何找到它的?