Java GC概念:CMS初始化占用分数



我配置了以下内存选项:

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+512MB,对吧?

或者"-XX:NewSize=786m -XX:MaxNewSize=786m"代表NON堆?

请解释一下这个概念。

两者都没有。在旧一代的占用率达到50%后,它将有资格运行,其中旧一代大小是堆的大小减去新一代的大小:2560m-786m=1792m,因此这将是在老一代达到896m之后。但这并不总是唯一的参数。如果您希望它成为唯一的参数,您可能需要添加-XX:+UseCMSInitiatingOccupancyOnly(尽管根据我的经验,CMS实际上在阈值时触发,即使没有它)。

总结:

  • -Xmx是堆内存总量
  • -XX:NewSize/-XX:MaxNewSize是堆内新一代的大小范围
  • 不同的是老一代的体型范围
  • -XX:PermSize/-XX:MaxPermSize是永久生成的大小范围,它是非堆内存

最新更新