• 某大厂线上JVM参数(CMS+ParNew)参数解析


    参数如下

    export JAVA_OPTS="-Djava.library.path=/usr/local/lib -server -Xms16384m -Xmn4096m -Xmx16384m -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses -XX:+CMSClassUnloadingEnabled -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=75 -XX:ParallelGCThreads=16 -XX:+CMSScavengeBeforeRemark"

    -Xms16384m 初始堆大小16G

    -Xmn4096m 新生代大小4G

    -Xmx16384m 最大堆大小16G

    -XX:MetaspaceSize=512m 元空间大小512M

    -XX:MaxMetaspaceSize=512m 元空间最大大小512M

    -XX:+UseParNewGC 启用了 ParNew 垃圾收集器,它是一种并行的年轻代垃圾收集器

    -XX:+UseConcMarkSweepGC 启用了 CMS 垃圾收集器,它是一种并发垃圾收集器,用于老年代的垃圾回收

    这里就是使用了ParNew+CMS的组合,这也是最常见的组合之一,ParNew用于新生代, CMS用于老年代回收

    +ExplicitGCInvokesConcurrentAndUnloadsClasses是Java虚拟机的非标准(非标准化)JVM参数之一,用于调整垃圾收集器的行为。这个参数的作用是在显式调用System.gc()方法时,同时触发并发垃圾收集(Concurrent Garbage Collection)并尝试卸载不再被引用的类。

    具体来说:

    • ExplicitGCInvokesConcurrentAndUnloadsClasses参数启用后,当你调用System.gc()方法手动触发垃圾收集时,JVM会尝试同时执行并发垃圾收集操作,这通常是指CMS(Concurrent Mark-Sweep)垃圾收集器的工作。并发垃圾收集可以在不阻塞应用程序的情况下进行垃圾回收。
    • 同时,启用此参数还会尝试卸载不再被引用的类。在Java中,类的卸载通常是指卸载已加载的类,这些类不再被任何类加载器或对象引用。类的卸载有助于释放类加载器所持有的内存和资源。

    一般来说,这个参数通常在特定的性能调优场景下使用,而不是在普通应用程序中启用,因为它可能会导致垃圾收集操作的复杂性增加,可能会影响应用程序的性能。

    +CMSClassUnloadingEnabled 是 Java 虚拟机的非标准(非标准化)JVM 参数之一,用于调整垃圾收集器的行为。具体来说,这个参数的作用是启用 CMS(Concurrent Mark-Sweep)垃圾收集器在进行垃圾回收时尝试卸载不再被引用的类(Class Unloading)

    -XX:+UseCMSInitiatingOccupancyOnly (这里是设置为了true,如果想设置为false则使用-UseCMSInitiatingOccupancyOnly,注意开头的“-”) UseCMSInitiatingOccupancyOnly 是一个布尔参数,用于控制CMS垃圾收集器是否仅仅依赖于 CMSInitiatingOccupancyFraction 来触发收集。如果将其设置为 true,则CMS收集器将仅在老年代内存使用达到或超过 CMSInitiatingOccupancyFraction 指定的阈值时触发收集。

    • 如果将其设置为 false(默认值为 false),则CMS收集器在特定条件下还可以根据晋升失败(promotion failure)等情况主动触发收集,而不仅仅依赖于老年代内存的占用率。

     -XX:CMSInitiatingOccupancyFraction=75   • CMSInitiatingOccupancyFraction 是一个CMS垃圾收集器的触发阈值参数,用于指定老年代(年老代)内存占用的百分比阈值。当老年代内存使用达到或超过这个百分比时,CMS收集器将启动一次垃圾回收。

    • 默认情况下,CMSInitiatingOccupancyFraction 的值为 68%,这意味着当老年代内存使用达到 68% 时,CMS收集器将尝试执行一次并发垃圾回收。可以通过设置此参数来调整阈值,以适应特定应用程序的需求。较低的阈值可以减少停顿时间,但可能会更频繁地触发CMS收集。

    -XX:ParallelGCThreads=16设置并行垃圾收集器线程数为16

    CMSScavengeBeforeRemark 参数的作用是在CMS的"Remark"阶段(重新标记阶段)之前执行一次年轻代的垃圾收集(Scavenge)。Remark阶段(重新标记阶段)是CMS中的一个标记阶段,用于处理在并发标记期间产生的引用更新。通常,Remark阶段的停顿时间相对较短。

    启用 -XX:+CMSScavengeBeforeRemark 参数后,CMS在执行Remark阶段之前,会先执行一次年轻代的垃圾收集(CMS来执行这次新生代的垃圾回收,而不是ParNew)。这个额外的年轻代垃圾收集操作有助于减少Remark阶段的工作量和停顿时间,因为年轻代中的大部分垃圾已经被清理掉,不需要在Remark阶段处理。这可以进一步降低CMS垃圾收集的停顿时间。

    需要注意的是,启用此选项可能会增加总体的垃圾收集开销,因为它会引入额外的垃圾收集操作。

  • 相关阅读:
    服务器硬盘HDD与SSD的优缺点是什么
    uni-app:实现时钟自走(动态时钟效果)
    Leetcode-234 回文链表
    校园二手服务平台
    【鸿蒙】创建第⼀个鸿蒙项⽬
    探究 Meme 的金融与社交属性
    生于云、长于云,RocketMQ 5.0 再出发
    金蝶 EAS及EAS Cloud任意文件上传漏洞复现
    SpringCloudAlibaba入门学习笔记20240408~20240424
    FreeRTOS 中断管理介绍和实操
  • 原文地址:https://blog.csdn.net/Chang_Yafei/article/details/132944883