一、引用计数:没法解决循环引用的问题算法
二、根可达性算法: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 去清理老年代碎片
二、浮动垃圾(第二次回收)
并发标记算法:三色标记
垃圾收集器跟内存大小的关系