Java GC概念:CMSInitiatingOccupancyFraction

Java GC概念:CMSInitiatingOccupancyFraction,java,jakarta-ee,memory,memory-management,Java,Jakarta Ee,Memory,Memory Management,我配置了以下内存选项: export MEM_OPTS=“-Xmx2560m-Xms2560m-XX:NewSize=786m-XX:MaxNewSize=786m-XX:+UseTLAB-XX:MaxPermSize=512m” GC参数如下所示: 导出GC1_OPTS=“-XX:+UseConMarkSweepGC-XX:+UseParNewGC-XX:CMSinitiatingOccinecyFraction=50-XX:+CMSClassEnsweepIngenabled-XX:+CMS

我配置了以下内存选项:

export MEM_OPTS=“-Xmx2560m-Xms2560m-XX:NewSize=786m-XX:MaxNewSize=786m-XX:+UseTLAB-XX:MaxPermSize=512m”

GC参数如下所示:

导出GC1_OPTS=“-XX:+UseConMarkSweepGC-XX:+UseParNewGC-XX:CMSinitiatingOccinecyFraction=50-XX:+CMSClassEnsweepIngenabled-XX:+CMSClassUnloadingEnabled-XX:+CMSParallelRemarkEnabled-XX:+UseAptivegBoundary” export GC2_OPTS=“-XX:+ExplicitGCInvokesConcurrent”

我想知道CMS什么时候运行。它会在2560MB内存的50%之后运行,还是在512MB内存的50%之后运行

这个概念是什么


我的总堆内存为=2560+786+512 MB。。。。正确的?或者“-XX:NewSize=786m-XX:MaxNewSize=786m”表示非堆。请解释这个概念。

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

总结如下:

  • -Xmx
    是堆内存总量
  • -XX:NewSize
    /
    -XX:MaxNewSize
    是堆内新一代的大小范围
  • 不同之处在于老一代人的规模范围
  • -XX:PermSize
    /
    -XX:MaxPermSize
    是永久生成的大小范围,它是非堆内存