2012-09-12 107 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