【问题标题】:Java GC Concept : CMSInitiatingOccupancyFractionJava GC 概念:CMSInitiatingOccupancyFraction
【发布时间】:2012-09-05 14:06:50
【问题描述】:

我配置了以下内存选项:

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

请解释一下这个概念。

【问题讨论】:

    标签: java jakarta-ee memory memory-management


    【解决方案1】:

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

    总结一下:

    • -Xmx 是总堆内存
    • -XX:NewSize / -XX:MaxNewSize 是该堆内新生代的大小范围
    • 区别在于老年代的大小范围
    • -XX:PermSize/-XX:MaxPermSize是永久代的大小范围,也就是非堆内存

    【讨论】:

      猜你喜欢
      • 2017-01-13
      • 1970-01-01
      • 2016-08-30
      • 2013-11-01
      • 2014-02-25
      • 1970-01-01
      • 1970-01-01
      • 2016-09-21
      • 1970-01-01
      相关资源
      最近更新 更多