美文网首页
4.JVM系列-垃圾收集器总结

4.JVM系列-垃圾收集器总结

作者: 爱吃糖果 | 来源:发表于2018-12-10 17:31 被阅读3次

目录

一、背景

二、垃圾收集器比较

三、常用JVM参数

四、垃圾收集器对比

五、关系图

一、背景

      前面的章节单独说了下CMS和G1,而更早的收集器如并没有被淘汰,当CMS和G1收集失败后会转为使用Serial Old收集器进行一次full gc,所以学习其他的收集器也是有必要的。   

二、垃圾收集器比较

垃圾收集器特点适合场景

Serial(新生代)单线程全程STW流量小、内存<4G、单核

Serial Old(老)同上同上

ParNew(新)Serial的多线程版本搭配CMS实现低停顿

ParallelScavenge(新)可设置最大gc停顿时间及gc时间比吞吐高(用户时间/用户+GC),适用于非交互式,如批处理应用

Parallel Old(老)同上同上

CMS(老年代)低停顿、易产生内存碎片想低停顿但可以容忍较多的fgc

G1(新+老)低停顿、不易产生内存碎片内存>=6G、停顿可控、不容忍频繁fgc

ZGC(新+老)STW不超过10毫秒

STW不会随堆大小而增加

堆范围几百M~几TB。

使用大中小内存低停顿为目标

G1的目标是淘汰CMS,ZGC的目标是淘汰G1

三、常用JVM参数

CMS和G1相关的参数在上2篇章节已说明,这里不再列。

参数意义优化建议默认值

-Xms2000m  设置堆初始2G同Xmx,避免动态调整,默认空余堆内存小于40%会调增大于70%会调小物理内存的1/64

-Xmx2000m设置堆最大2G同Xms物理内存的1/4

-Xss每个线程的栈大小无特殊不要超过默认值,否则会影响线程数1M

-XX:NewRatio=4 年轻代(eden+2s):老年代=1:4若已设置xmn,不需设此参数,另外选择G1和ZGC不建议设此参数2

-XX:SurvivorRatio=82s:eden=1:8G1和ZGC动态分配不建议设置此参数8

-XX:MaxGCPauseMillis=100允许的GC最大的暂停时间,过小GC就会频繁,过大暂停久太过频繁或者暂停久可通过此参数调整200ms

-XX:+TieredCompilation使用分层编译来提升启动速度默认打开true

-XX:CICompilerCount=N编译线程的数目无需要不必调整4

-XX:-UseBiasedLocking 禁用偏向锁在存在大量锁对象的创建并高度并发的环境下禁用偏向锁能够带来一定的性能优化打开

-XX:AutoBoxCacheMaxJDK默认只缓存 -128 ~ +127的Integer 和 Long,此参数更改次值对于频繁创建Integer对象的可使用此参数优化128

-XX:+AlwaysPreTouchJAVA进程启动的时候,虽然我们可以为JVM指定合适的内存大小,但是这些内存操作系统并没有真正的分配给JVM,而是等JVM访问这些内存的时候,才真正分配,这样会造成以下问题。

1、GC的时候,新生代的对象要晋升到老年代的时候,需要内存,这个时候操作系统才真正分配内存,这样就会加大young gc的停顿时间;

2、可能存在内存碎片的问题。

JVM就会先访问所有分配给它的内存,让操作系统把内存真正的分配给JVM.后续JVM就可以顺畅的访问内存了。

false

-XX:-OmitStackTraceInFastThrow抛出相同的异常N次之后,JVM会对某些特定异常如NPE进行优化,不再带异常栈。如日志里一条条Nul Point Exception不接收此操作,可以关闭true

-XX:+PrintGCApplicationStoppedTime除了打印清晰的完整的GC停顿时间外,还可以打印其他的JVM停顿时间打开false

-XX:+PrintPromotionFailure打开了就知道是多大的新生代对象晋升到老生代失败从而引发Fgc打开false

比较通用的配置方案:

JVM_ARGS="-server -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8 -Djava.io.tmpdir=/tmp -Djava.net.preferIPv6Addresses=false"

JVM_GC="-XX:+UseG1GC -XX:G1HeapRegionSize=4M -XX:InitiatingHeapOccupancyPercent=40 -XX:MaxGCPauseMillis=100  -XX:-UseBiasedLocking -XX:+PrintGCDetails -XX:+PrintHeapAtGC -XX:+PrintTenuringDistribution -XX:+PrintGCDateStamps -XX:+PrintStringTableStatistics -XX:+PrintAdaptiveSizePolicy -XX:+PrintGCApplicationStoppedTime -XX:+PrintFlagsFinal -XX:-UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=10M -Xloggc:$LOG_PATH/gc.log -XX:ErrorFile=$LOG_PATH/vmerr.log  -Xss512k -Xmx"$jvmSize" -Xms"$jvmSize" -XX:MetaspaceSize="$MaxMetaspaceSize" -XX:MaxMetaspaceSize="$MaxMetaspaceSize" -XX:+AlwaysPreTouch -XX:ReservedCodeCacheSize="$ReservedCodeCacheSize" -XX:InitialCodeCacheSize="$InitialCodeCacheSize" -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$LOG_PATH"

其中

case Using G1 GC

case 1G: Xms=512m MaxMetaspaceSize=64m ReservedCodeCacheSize=32m InitialCodeCacheSize=32m

case2G:  Xms=1g MaxMetaspaceSize=128m ReservedCodeCacheSize=64m InitialCodeCacheSize=64m

case4G:  Xms=2g MaxMetaspaceSize=256m ReservedCodeCacheSize=64m InitialCodeCacheSize=64m

case8G:  Xms=4g MaxMetaspaceSize=256m ReservedCodeCacheSize=128m InitialCodeCacheSize=128m

case16G:Xms=12g MaxMetaspaceSize=512m ReservedCodeCacheSize=256m InitialCodeCacheSize=256m

case22~28G:  Xms=18g MaxMetaspaceSize=512m ReservedCodeCacheSize=256m InitialCodeCacheSize=256m

case32~44G:  Xms=24g MaxMetaspaceSize=1g ReservedCodeCacheSize=512m InitialCodeCacheSize=512m

case64~88G:  Xms=32g MaxMetaspaceSize=2g ReservedCodeCacheSize=1g InitialCodeCacheSize=1g

四、垃圾收集器对比

CMS和G1在上2章节已说明。

简介新/老基于算法

简介新/老基于算法

Serial单线程,全程STW新生代复制

ParNewSerial的多线程版本新生代复制

Parallel Scavenge可以通过调整参数,控制停顿时间或最大的吞吐量新生代复制

Serial Old单线程,CMS和G1失败采用此老年代标记整理

Parallel Old可以通过调整参数,控制停顿时间或最大的吞吐量老年代标记整理

五、关系图

相关文章

  • 4.JVM系列-垃圾收集器总结

    目录 一、背景 二、垃圾收集器比较 三、常用JVM参数 四、垃圾收集器对比 五、关系图 一、背景 前面的章...

  • JVM源码分析系列

    JVM G1算法系列 G1垃圾收集器介绍 G1垃圾收集器之RSet G1垃圾收集器之SATB G1垃圾收集器之对象...

  • JVM 内存区域与GC

    本文思路1.JVM运行时内存划分2.对象创建内存动作3.Java线程栈4.JVM垃圾收集器 1.JVM运行时内存划...

  • 深入学习JVM(三) -- JVM垃圾收集-G1

    G1 (Garbage First)垃圾收集器 因为上一篇文章JVM垃圾收集器总结[https://juejin....

  • Java垃圾回收机制-垃圾收集器(二)

    上篇总结了常见的垃圾收集算法,这里回顾下常见的垃圾收集器。 上图展示了7种不同分代的垃圾收集器,如果两个收集器之间...

  • 垃圾收集器总结

    垃圾收集器总结 各种收集器组合使用的参数 Serial + CMS 注意不能使用-XX:+UseConcMarkS...

  • jvm系列之垃圾收集器

    jvm系列之垃圾收集器 1 垃圾收集器介绍    java内存在运行时被分为多个区域,其中程序计数器、虚拟机栈、本...

  • JVM垃圾收集器总结

    通过上篇JVM垃圾回收算法和垃圾收集器我们对JVM的七大垃圾收集器的运行原理有了大致的了解,我们来总结一下他们之间...

  • 垃圾收集器

    简介  垃圾收集器是垃圾收集算法的具体实现,各种垃圾收集器没有好坏之分,适合自己当前应用的垃圾收集器才是最好的垃圾...

  • JVM学习笔记之垃圾收集器【五】

    垃圾收集器 HotSpot 包含的垃圾收集器 一、串行收集器 1.1、Serial 收集器 在 JDk1.3 之前...

网友评论

      本文标题:4.JVM系列-垃圾收集器总结

      本文链接:https://www.haomeiwen.com/subject/aijdhqtx.html