下面内容是介绍在进行JVM GC优化的时候可能用到的参数
关于JVM的其他文章
这部分主要是介绍使用不同回收器应该使用的参数配置
参数 | 说明 | 使用 |
---|---|---|
-XX:+UseSerialGC | 一个基础简单的单线程GC算法 | 用于单核或者容器中,或者小于100MB的堆 |
-XX:+UseParallelGC | JDK1.4的垃圾收集器,使用多线程进行GC的算法 | 用于优化吞吐而不是响应速度时使用,JDK8中默认 |
-XX:+UseConcMarkSweepGC | JDK1.5的垃圾收集器版本 | 优化响应速度的场景。如果使用的JDK8,建议使用G1。 |
-XX:+UseG1GC | JDK11的垃圾收集器版本,以及移植回1.8版本在服务器停顿时使用多个线程回收新生代,并使用后台参数尽可能短停顿从老年代回收垃圾 | 如果服务CPU资源充足,并且不希望有较长的停顿。JDK11默认 |
-XX:+UseParNewGC | Serial收集器的多线程版本,配合CMS使用的新生代GC算法 | 优化响应速度的场景。如果使用的JDK8,建议使用G1。 |
-XX:+UseZGC | 使用实验性的Z垃圾回收器,JDK12使用 | 实验性GC |
-XX:+UseShenandoahGC | 使用实验性的Shenandoah垃圾回收器,OpenJDK12使用 | 实验性GC |
-XX:+UseEpsilonGC | 使用实验性的Epsilon垃圾回收器,JDK12使用 | 内部测试才会使用的GC |
下面参数是打开GC日志,并配置需要的日志内容时候需要的参数
参数 | 使用说明 | 使用实际 |
---|---|---|
-Xlog:gc* | 开启GC日志 | 即使生产环境也最好开启GC日志 |
-verbose:gc | 开启基本日志 | 最好开启GC日志,但是基本日志可能看不出什么内容 |
-Xloggc:
| 日志输出到文件中,而不是标准输出 | 指定一个专门的地址保存GC信息 |
-XX:+PrintGC | 开启GC日志基本输出 | 最好开启GC日志,但是基本日志可能看不出什么内容 |
-XX:+PrintGCDetails | 开启GC日志详细输出 | 最好开启GC日志 |
-XX:+PrintGCTimeStamps | 开启GC日志相对时间戳 | 开启时间戳会更方便的判断GC情况 |
-XX:+PrintGCDateStamps | 开启GC日志日期时间戳 | 开启时间戳会更方便的判断GC情况 |
-XX:+PrintReferenceGC | 开启GC过程中软引用和弱引用的处理信息 | 开启这个参数可以通过日志判断这些引用的处理效率 |
-XX:+UseGCLogFileRotation | 开启GC滚动日志 | 如果预见GC日志会消耗大量空间,最好开启此配置 |
-XX:NumberOfGCLogFiles=N | 设置滚动给日志时日志数量 | 如果预见GC日志会消耗大量空间,最好设置此参数 |
-XX:GCLogFileSize=N | 设置滚动日志时日志大小 | 如果预见GC日志会消耗大量空间,最好设置此参数 |
这部分参数主要是对JVM的堆的一些调整,在JDK8版本下使用任意回收器都可以配置的参数
参数 | 使用说明 | 使用实际 |
---|---|---|
-Xms | 设置堆的初始大小 | |
-Xmx | 设置堆的最大大小 | |
-Xmn | 设置新生代的初始大小和最大的大小 | 需要微调堆内存时 |
-XX:NewRation | 设置新生代和老年代的比例 | 增加它的值可以减少新生代的内存。 |
-XX:NewSize | 设置新生代的初始大小 | 需要微调堆内存时 |
-XX:MaxNewSize | 设置新生代的最大大小 | 需要微调堆内存时 |
-XX:MetaspaceSize=N | 设置元空间的大小 | 对于使用大量类的非应用程序可以在默认值的基础上增加这个值 |
-XX:MaxMetaspaceSize=N | 设置元空间的最大大小 | 用来限制元空间使用原生内存的大小 |
-XX:ParallelGCThreads=N | 设置垃圾回收器并行阶段使用的线程数 | |
-XX:+UseAdaptiveSizePolicy | 设置这个这个参数后JVM将调整各种堆的大小,满足GC目标 | 这个参数默认打开,如果决定自己优化堆的大小可以关闭这个参数 |
-XX:+PrintAdaptiveSizePolicy | GC日志中添加关于分代大小调整的信息 | 可以分析使用G1的时候,检查巨型对象的分配是否触发Full GC |
-XX:+PrintTenuringDistribution | GC日志中添加对象的年龄分布 | 根据对象的年龄分布来判断是否应该调整与对象晋升有关的参数 |
-XX:InitialSurvivorRatio=N | 设置垃圾收集器使用的Survivor空间比率 | 如果对象频繁晋升老年代,应该减少此参数 |
-XX:MinSurvivorRatio=N | 设置垃圾收集器使用的Survivor空间比率的自适应量。表示在GC之后,如果需要重新计算survivor的值,survivor的新值不能低于根据它计算出来的值。 | |
-XX:TargetSurvivorRatio=N | JVM试图在Survivor空间中保留的空闲空间 | 增大此参数会减少Survivor空间的最大大小 |
-XX:InitialTenuringThreshold=N | JVM试图将对象保留在Survivor空间中的周期数 | 增大该值可以延长对象保留在Survivor空间的时间 |
-XX:MaxTenuringThreshold=N | JVM试图将对象保留在Survivor空间中的最大周期数 | 增大该值可以延长对象保留在Survivor空间的时间 |
-XX:+DisableExplicitGC | 手动调用System.gc()不会生效 | 组织显式的调用System.gc() |
-XX:-AggressiveHeap | 启动默认的调优策略 | 回启动一系列的优化设置,但并不一定符合实际要求 |
这部分是针对不同的回收器需要设置不同的优化参数
参数 | 使用说明 | 使用实际 |
---|---|---|
-XX:MaxGCPauseMillis=N | 每次年轻代垃圾回收的最长时间(最大暂停时间) | 发现默认值无法满足GC需要时 |
-XX:GCTimeRatio=N | 设置垃圾回收时间占程序运行时间的百分比 | 发现默认值无法满足GC需要时 |
参数 | 使用说明 | 使用实际 |
---|---|---|
-XX:MaxGCPauseMillis=N | 设置G1回收器停顿时间 | 可以尝试增加这个值防止Full GC |
-XX:ConcGCThreads=N | 设置G1后台扫描的线程数 | 当有足够的CPU使用,且G1 遇到并发失败的时候 |
-XX:InitiatingHeapOccupancyPercent=N | G1开始进行后台扫描的时机 | G1 遇到并发失败的时候,调小这个参数,提前进入并发周期 |
-XX:G1MixedGCCountTarget=N | Mixed GC的次数 | 如果Mixed GC周期花费大量时间可以增大这个值 |
-XX:G1HeapRegionSize=N | 设置G1区域大小 | 当有非常大的堆,或者当应用分配非常大的对象时可以增加此数据 |
-XX:UseStringDedupLication | 让G1去除重复字符串 | 当程序有大量重复字段 |
参数 | 使用说明 | 使用实际 |
---|---|---|
-XX:CMSInitiatingOccupancyFraction=N | 设置CMS开始老年代扫描的时机 | CMS 遇到并发失败的时候,调小这个参数,提前进入并发周期 |
-XX:+UseCmsInitiatingOccupancyOnly | 让CMS使用CMSInitiatingOccupancyFraction 来决定何时开始后台扫描 | 和CMSInitiatingOccupancyFraction 一起使用 |
-XX:ConcGCThreads=N | 设置CMS后台扫描的线程数 | 当有足够的CPU使用,且CMS 遇到并发失败的时候 |
-XX:+CMSIncrementalMode=N | 以增量模式运行CMS | 不再支持 |