首页 > 技术文章 > 高并发场景下的一种JVM GC优化配置【CMS】

LionheartCGJ 2020-07-13 16:21 原文

主要了列了下CMS相关的配置项,和配置项相关含义,具体CMS收集器工作机制,可以参考下其他资料;GC策略的选择需要根据具体的场景去定制,这里只是抛砖引玉

  1. 整体配置(默认实例规格是8c16g,线程数、内存大小需要根据实例规格去设置)
    -Xmn1024m -XX:+UseConcMarkSweepGC -XX:ParallelCMSThreads=4 -XX:ParallelGCThreads=8 -XX:+CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=80 -XX:+UseCMSInitiatingOccupancyOnly -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=3 -XX:+CMSClassUnloadingEnabled
  2. 配置项详解

    UseConcMarkSweepGC: 启用CMS收集器
    CMSParallelRemarkEnabled:开启并行重新标记

    ParallelCMSThreads: 老年代并行收集线程数(默认 ParallelCMSThreads = (ParallelGCThreads + 3) / 4)
    ParallelGCThreads:年轻代并行收集线程数(ParallelGCThreads = (ncpus <= 8) ? ncpus : 3 + ((ncpus * 5) / 8))

    CMSInitiatingOccupancyFraction:老年代触发FullGC的内存使用率
    UseCMSInitiatingOccupancyOnly:始终使用设定的阈值触发CMS收集

    UseCMSCompactAtFullCollection:触发CMSFullGC后执行碎片整理
    CMSFullGCsBeforeCompaction:设置执行n次FullGC后触发碎片整理

    CMSClassUnloadingEnabled:开启CMS回收Pmer区

   (ps:jdk7及以下ParallelCMSThreads > ParallelGCThreads 会导致jvm崩溃 https://bugs.openjdk.java.net/browse/JDK-8020236)


  (ps:jvm内存设置
    java -Xmx3550m -Xms3550m -Xmn2g -Xss128k
    -Xmx3550m:设置JVM最大可用内存为3550M。
    -Xms3550m:设置JVM促使内存为3550m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。
    -Xmn2g:设置年轻代大小为2G。整个JVM内存大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。
    -Xss128k:设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。更具应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。

推荐阅读