JVM性能调优之GC
chenlong 发布:2021-10-30 17:35:54阅读:1.什么是垃圾
没有任何引用指向的一个对象或者多个对象(循环引用)
2.如何定位垃圾
(1)引用计数(ReferenceCount)
(2)根可达算法(RootSearching)
引用循环,找不到的都是垃圾
3.常见的垃圾回收算法
标记清除(mark sweep) - 位置不连续 产生碎片 效率偏低(两遍扫描)
拷贝算法 (copying) - 没有碎片,浪费空间
标记压缩(mark compact) - 没有碎片,效率偏低(两遍扫描,指针需要调整)
4.JVM内存分代模型(用于分代垃圾回收算法)
(1)部分垃圾回收器使用的模型
除Epsilon ZGC Shenandoah之外的GC都是使用逻辑分代模型
G1是逻辑分代,物理不分代
除此之外不仅逻辑分代,而且物理分代
(2)新生代 + 老年代 + 永久代(1.7)Perm Generation/ 元数据区(1.8) Metaspace
永久代 元数据 - Class
永久代必须指定大小限制 ,元数据可以设置,也可以不设置,无上限(受限于物理内存)
字符串常量 1.7 - 永久代,1.8 - 堆
MethodArea逻辑概念 - 永久代、元数据
(3)新生代 = Eden + 2个suvivor区
YGC回收之后,大多数的对象会被回收,活着的进入s0
再次YGC,活着的对象eden + s0 -> s1
再次YGC,eden + s1 -> s0
年龄足够 -> 老年代 (15 CMS 6)
s区装不下 -> 老年代
(4)老年代
顽固分子
老年代满了FGC Full GC
(5)GC Tuning (Generation)
尽量减少FGC
MinorGC = YGC
MajorGC = FGC
(6)对象分配过程图
5.常见的垃圾回收器
(1)垃圾回收器的发展路线,是随着内存越来越大的过程而演进
从分代算法演化到不分代算法
Serial算法 几十兆
Parallel算法 几个G
CMS 几十个G - 承上启下,开始并发回收 -
.- 三色标记 -
(2)JDK诞生 Serial追随 提高效率,诞生了PS,为了配合CMS,诞生了PN,CMS是1.4版本后期引入,CMS是里程碑式的GC,它开启了并发回收的过程,但是CMS毛病较多,因此目前任何一个JDK版本默认是CMS
并发垃圾回收是因为无法忍受STW
(3)Serial 年轻代 串行回收
(4)PS 年轻代 并行回收
(5)ParNew 年轻代 配合CMS的并行回收
(6)SerialOld
(7)ParallelOld
(8)ConcurrentMarkSweep 老年代 并发的, 垃圾回收和应用程序同时运行,降低STW的时间(200ms)
CMS问题比较多,所以现在没有一个版本默认是CMS,只能手工指定
CMS既然是MarkSweep,就一定会有碎片化的问题,碎片到达一定程度,CMS的老年代分配对象分配不下的时候,使用SerialOld 进行老年代回收
想象一下:
PS + PO -> 加内存 换垃圾回收器 -> PN + CMS + SerialOld(几个小时 - 几天的STW)
几十个G的内存,单线程回收 -> G1 + FGC 几十个G -> 上T内存的服务器 ZGC
算法:三色标记 + Incremental Update
(9)G1(200ms - 10ms)
算法:三色标记 + SATB
(10)ZGC (10ms - 1ms) PK C++
算法:ColoredPointers + LoadBarrier
(11)Shenandoah
算法:ColoredPointers + WriteBarrier
(12)Eplison
(13)PS 和 PN区别的延伸阅读:
▪https://docs.oracle.com/en/java/javase/13/gctuning/ergonomics.html#GUID-3D0BB91E-9BFF-4EBB-B523-14493A860E73
(14)垃圾收集器跟内存大小的关系
- Serial 几十兆
- PS 上百兆 - 几个G
- CMS - 20G
- G1 - 上百G
- ZGC - 4T - 16T(JDK13)
1.8默认的垃圾回收:PS + ParallelOld
小礼物走一波,支持作者
赏还没有人赞赏,支持一波吧