2012-09-12 106 views
10

我有以下配置的内存选项:Java的GC概念:CMSInitiatingOccupancyFraction

出口MEM_OPTS =“ - Xmx2560m -Xms2560m -XX:新尺寸=786米-XX:MaxNewSize =786米-XX:+ UseTLAB -XX:MaxPermSize参数=512米“

GC参数如下:

出口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”用于NON堆。请解释这个概念。

回答

22

也没有。老一代的占有率达到50%后,将有资格运行,其中老一代的规模是堆的大小减去新一代的规模:2560米--786米= 1792米,所以这将是后老一代达到896米。但这并不总是唯一的参数。你可能想要添加-XX:+ UseCMSInitiatingOccupancyOnly如果你想让它成为唯一的参数(尽管以我的经验,CMS实际上触发了门槛,即使没有它)。

总结:

  • -Xmx是总的堆内存
  • -XX:NewSize/-XX:MaxNewSize是新一代的堆
  • 差内的大小的范围的尺寸的范围内老一代
  • -XX:PermSize/-XX:MaxPermSize是永久代的大小范围,它是非堆内存
+0

感谢您的明确解释。 – VJS