Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PS旧Gen内存在堆内存使用情况:Java内存不足异常的GC设置_Java_Jboss_Garbage Collection_Jvm_Jvm Arguments - Fatal编程技术网

PS旧Gen内存在堆内存使用情况:Java内存不足异常的GC设置

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

以下是我的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 -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的那一个请忽略我已经重新启动了服务器…您是如何找到它的?