17

我配置了以下内存选项:

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"用于非堆?

请解释一下这个概念。

4

1 回答 1

30

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

总结一下:

  • -Xmx是总堆内存
  • -XX:NewSize/-XX:MaxNewSize是该堆内新生代的大小范围
  • 不同的是老年代的大小范围
  • -XX:PermSize/-XX:MaxPermSize是永久代的大小范围,也就是非堆内存
于 2012-09-12T14:23:41.537 回答