JVM参数和垃圾收集器组合

JVM常用参数整理和垃圾收集器组合

jvm参数整理

  • -Xms64m :初始堆大小
  • -Xmx128m :最大堆大小
  • -Xmn32m :年轻代大小
  • -XX:MaxNewSize=256m : 最大新生代大小
  • -Xss512k:栈大小
  • -XX:MetaspaceSize=256M :Metaspace扩容时触发FullGC的初始化阈值(并不是元空间的初始化大小,元空间是不断扩容的,当达到这个值时,就会触发full gc,链接
  • -XX:MaxMetaspaceSize=512M:Metaspace最大大小
  • -XX:NewRatio=2:老年代和新生代的比例
  • -XX:SurvivorRatio=8 :Eden区与一个Survivor区的大小比值(所以s0:s1:eden=1:1:8
  • -XX:MinHeapFreeRatio=40:空闲堆空间的最小百分比。如果空闲堆空间的比例小于它,则会进行堆扩容
  • -XX:MaxHeapFreeRatio=70:空闲堆空间的最大百分比。如果空闲堆空间的比例大于它,则会进行堆缩容
  • -XX:-DisableExplicitGC:禁止显式GC,即禁止程序中System.gc()。个人感觉没必要
  • -XX:+HeapDumpOnOutOfMemoryError:OOM时导出堆快照到文件
  • -XX:HeapDumpPath=/home/huskie/gc/oom.hprof:OOM时导出文件路径
  • -Xloggc:/home/ruidong/gc.log 存储gc日志的路径
  • -XX:OnOutOfMemoryError:OOM时操作,比如如执行脚本发送邮件
  • -XX:+TraceClassLoading:打印加载类的详细信息
  • -XX:+PrintGCDetails:打印GC详细信息
  • -XX:+PrintGCTimeStamps:打印CG发生的时间戳(相对于项目启动时间)
  • -XX:+PrintGCDateStamps:打印GC发生的时间
  • -XX:+PrintHeapAtGC:每一次GC前和GC后,都打印堆信息
  • -XX:+PrintClassHistogram:按下Ctrl+Break后,打印类的信息
  • -XX:+PrintGCApplicationConcurrentTime :打印应用程序的运行时间(许多事情会导致JVM暂停所有线程,停在安全点。gc也只是其中的一种,当暂停之后在重启应用线程,则会刷新这个时间(归0),在重新计数)链接
  • -XX:+PrintGCApplicationStoppedTime :打印应用线程暂停的时间,显示应用线程被暂停了多久和应用线程暂停到安全点花费的时间
  • -XX:TargetSurvivorRatio=50 :survivor空间的晋升大小空间百分比(默认为50)
  • -XX:MaxTenuringThreshold=15 :年轻代晋升到老年代的最大年龄阈值(tenuring threshold)。默认值为 15[每次GC,增加1岁,到15岁如果还要存活,放入Old区]。jvm还会动态的计算晋升阈值,方法:依次从年龄为1的对象大小加起来,一直加到大小超过了 [(TargetSurvivorRatio * survivor_capacity)/ 100 ]值,这时加起来的最大年龄大小即为这次晋升的临界阈值(具体算法在:hotspot\src\share\vm\gc_implementation\shared\ageTable.cpp文件里,方法为compute_tenuring_threshold)
  • -XX:+PrintTenuringDistribution :ygc 时打印当前晋升年龄信息

垃圾收集器

新生代

Serial(hotspot虚拟机在客户端下的默认新生代垃圾收集器)

单线程新生代收集器,复制算法,整个过程STW

优势:内存消耗最小

缺点:不适合大内存多处理器工作,慢

ParNew

多线程并行的新生代收集器,复制算法,整个过程STW

  • -XX:ParallelGCThreads=4 :并行收集的线程数

Parallel Scavenge

  • 吞吐量 = 运行用户代码时间 / ( 运行用户代码时间 + 垃圾收集时间 )

吞吐量优先的新生代并行多线程收集器,复制算法(标记-复制算法)

三个重要参数:

  • XX:MaxGCPauseMillis :垃圾收集最大停顿时间,大于0的毫秒数
  • -XX:GCTimeRatio: 大于0小于100的整数(运行用户代码时间比上垃圾回收的时间),默认为99,即允许最大1%的垃圾回收时间
  • -XX:+UseAdaptiveSizePolicy:开启垃圾收集器的自适应调节策略。虚拟机动态调整新生代,Eden区,Survivor区的比例和晋升大小

老年代

CMS

标记-清除算法的老年代收集器

Serial Old

Serial的老年代会收集,标记-整理算法

Parallel Scavenge Old

Parallel Scavenge收集器的老年代版本,标记-整理算法

整堆

G1(garbage-frist收集器)

垃圾收集器组合

  • Serial + SerialOld
  • Serial + CMS (jdk8声明废弃,jdk9已被取消)
  • ParNew +CMS (使用CMS收集器的默认组合)
  • ParNew + SerialOld (jdk8声明废弃,jdk9已被取消)
  • Parallel Scavenge + SerialOld
  • Parallel Scavenge + Parallel Scavenge Old(jdk8的默认组合)G1(jdk9的默认收集器,且CMS被标记为废弃了)

tips

  • java -XX:+PrintFlagsFinal -version :查看jvm默认参数。数据太多可配合grep使用

GCRoots对象

  • 虚拟机栈(栈帧中的本地变量表)中引用的对象
  • 本地方法栈(Native 方法)中引用的对象
  • 方法区中类静态属性引用的对象
  • 方法区中常量引用的对象
  • 所有被同步锁持有的对象