JVM垃圾回收算法

找到垃圾的方法

一、引用计数:没法解决循环引用的问题算法

二、根可达性算法:CG root 包括 线程栈变量、静态变量、常量池、JNI指针(调用C或C++用到的本地方法对象)多线程

清除算法

一、标记-清除  Mark - sweep   适合存活对象较多的。容易产生碎片,扫描两遍并发

二、拷贝 copy    适合存活对象较少的。浪费内存,移动复制对象,须要调整引用,扫描一遍ide

三、标记-压缩    Mark - compact         不容易产生碎片、不浪费内存,但 扫描两遍,移动对象线程

分代模型

除Epsilon ZGC Shenandoah以外的GC都是使用逻辑分代模型指针

G1是逻辑分代,物理不分代对象

除此以外不只逻辑分代,并且物理分代内存

栈上分配

线程私有小对象it

无逃逸class

线程本地分配(TLAB)

本地线程大小占用Eden的1%

小对象

多线程的时候不用竞争Eden就能够申请空间

常见的垃圾回收器

一、serial 和 serial old

二、parallel  和 parallel old

三、parNew 和 CMS

四、G1

五、ZGC 和 Shenandoah

CMS (并发)

初始标记(只标根节点) -> 并发标记 ->从新标记(标记并发标记产生的新对象)-> 并发清理

CMS的问题

一、内存碎片,碎片太多,会用Serial Old 去清理老年代碎片

二、浮动垃圾(第二次回收)

并发标记算法:三色标记

垃圾收集器跟内存大小的关系

  1. Serial 几十兆
  2. PS 上百兆 - 几个G
  3. CMS - 20G
  4. G1 - 上百G
  5. ZGC - 4T - 16T(JDK13)
相关文章
相关标签/搜索