我配置了以下内存选项:
export MEM_OPTS="-Xmx2560m -Xms2560m -XX:NewSize=786m -XX:MaxNewSize=786m -XX:+UseTLAB -XX:MaxPermSize=512m"
我的GC参数如下:
export GC1_OPTS="-XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:**CMSInitiatingOccupancyFraction=50** -XX:+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled -XX:+CMSParallelRemarkEnabled -XX:+UseAdaptiveGCBoundary "export GC2_OPTS="-XX:+ExplicitGCInvokesConcurrent"
CMS 运行时,是在 2560 MB 的 50% 后运行还是在 512 MB 内存的 50% 后运行?什么概念?
我的总堆内存将等于 2560 + 786 + 512 MB,对吧?
或者是 "-XX:NewSize=786m -XX:MaxNewSize=786m"
对于非堆?
请解释一下这个概念。
最佳答案
两者都没有。老年代的占用率达到50%后才有资格运行,其中老年代的大小是堆的大小减去新生代的大小:2560m - 786m = 1792m,这样就可以在老年代达到896m。但这并不总是唯一的参数。如果您希望它成为唯一参数,您可能需要添加 -XX:+UseCMSInitiatingOccupancyOnly(尽管根据我的经验,CMS 实际上会在阈值处触发,即使没有它)。
总结一下:
-Xmx
是总堆内存-XX:NewSize
/-XX:MaxNewSize
是该堆内新生代的大小范围- 区别在于老年代的大小范围
-XX:PermSize
/-XX:MaxPermSize
是永久代的大小范围,也就是非堆内存
关于Java GC 概念 : CMSInitiatingOccupancyFraction,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12390118/