Java GC 概念 : CMSInitiatingOccupancyFraction

标签 java jakarta-ee memory memory-management

我配置了以下内存选项:

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

请解释一下这个概念。

最佳答案

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

总结一下:

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

关于Java GC 概念 : CMSInitiatingOccupancyFraction,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12390118/

相关文章:

java - 从 run 方法调用同步方法

java - 连接到 ipv6 JMX 服务 URL 的 jconsole

jsf - session 结束时销毁 View 范围的bean

java - 实现远程JMS服务器

c++ - 为什么当远远超过 CPU 缓存大小时内存访问时间会增加

java - Apache Mahout K-means 聚类简介

java - TreeMap 会自动对键进行排序吗?

java - 是Java过滤器单例

r - 合并真的不是那么大的data.tables会立即导致R被杀死

c++ - 检查是否可以释放指针