某大厂线上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垃圾收集的停顿时间。

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

你可能感兴趣的:(JVM调优,架构师,架构设计,jvm,java,算法)