Java GC Concept : CMSInitiatingOccupancyFraction

2022-09-03 00:40:11

我配置了以下内存选项:

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"

请解释这个概念。


答案 1

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

总结一下:

  • -Xmx是总堆内存
  • -XX:NewSize / -XX:MaxNewSize是堆内新一代的大小范围
  • 不同之处在于老一代的尺寸范围
  • -XX:PermSize / -XX:MaxPermSize是永久生成的大小范围,即非堆内存

答案 2