rak*_*sja 22 java jboss garbage-collection jvm heap-memory
我们的应用程序需要非常大的内存,因为它处理非常大的数据.因此我们将最大堆大小增加到12GB(-Xmx).
以下是环境细节
OS - Linux 2.6.18-164.11.1.el5
JBoss - 5.0.0.GA
VM Version - 16.0-b13 Sun JVM
JDK - 1.6.0_18
Run Code Online (Sandbox Code Playgroud)
我们在质量保证和产品中有以上环境和配置.在QA中,我们将最大PS旧Gen(堆内存)分配为8.67GB,而在Prod中它仅为8GB.
在Prod中,对于特定的工作,Old Gen Heap达到8GB,挂起并且Web URL无法访问.服务器正在崩溃.但在QA中它也达到了8.67GB,但是执行了完整的GC并且它恢复到6.5GB或者其他东西.这里没有被绞死.
我们无法找到解决方案,因为两个盒子上的环境和配置都是相同的.
我这里有3个问题,
最大堆的2/3将分配给旧/终身.如果是这样的话,为什么它在一个地方是8GB而在另一个地方是8.67GB?
在这种情况下如何为新手和终身提供有效比率(12GB)?
为什么它在一个地方完全GCed而不在另一个地方?
任何帮助都会非常明显.谢谢.
如果您需要有关env或conf的更多详细信息,请告诉我.
Whi*_*g34 22
针对您的具体问题:
-XX:NewRatio=3
.听起来你需要更多的内存来生产.如果在QA上请求结束,则可能需要额外的0.67GB.这似乎并没有给你留下太多空间.您是否在生产质量保证上运行相同的测试?
由于您使用的是12GB,因此必须使用64位.您可以使用该-XX:+UseCompressedOops
选项来节省64位寻址的内存开销.它通常可以节省40%的内存,因此12GB将会更进一步.
根据您正在做的事情,并发收集器可能也会更好,特别是减少长GC暂停时间.我建议尝试这些选项,因为我发现它们运行良好:
-Xmx12g -XX:NewRatio=4 -XX:SurvivorRatio=8 -XX:+UseCompressedOops
-XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+DisableExplicitGC
-XX:+UseCMSInitiatingOccupancyOnly -XX:+CMSClassUnloadingEnabled
-XX:+CMSScavengeBeforeRemark -XX:CMSInitiatingOccupancyFraction=68
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
28852 次 |
最近记录: |