垃圾收集
对象已死?
引用计数算法
1  |  | 
优点
1  |  | 
缺点
1  |  | 
可达性分析算法
1  |  | 

GC Roots对象
- 在虚拟机栈(栈帧中的本地变量表)中引用的对象,譬如各个线程被调用的方法堆栈中使用到的参数、局部变量、临时变量等
 - 方法区中类静态属性引用的对象,譬如Java类的引用类型静态变量
 - 方法区中常量引用的对象,譬如字符串常量池(String Table)里的引用
 - 本地方法栈中JNI(Native方法)引用的对象
 - Java虚拟机内部引用的对象,譬如基本数据类型对应的Class对象,常驻的异常对象,系统类加载器
 - 所有被同步锁(synchronized关键字)持有的对象
 - 反应Java虚拟机内部情况的对象,譬如JMXBean、JVMTI中注册的回调、本地代码缓存等
 
1  |  | 
引用
- 强引用,类似Object obj = new Object()这种引用关系,只要强引用关系存在,垃圾收集器就永远不会收掉被引用的对象
 - 软引用,有用,但非必须的对象。在系统将要发生内存溢出异常前,会把这些对象列进回收范围之中进行第二次回收
 - 弱引用,描述那些非必须对象,但是它的强度比软引用更弱一些,每次都会被垃圾收集器收集
 - 虚引用,最弱的一种引用关系,一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象实例。唯一目的只是为了能在这个对象被收集器回收时收到一个系统通知
 
生存还是死亡
1  |  | 
垃圾收集算法
1  |  | 
注意
1  |  | 
1  |  | 
标记-清除
优点
1  |  | 
缺点
1  |  | 
标记-整理
使用场景
1  |  | 
优点
1  |  | 
缺点
1  |  | 
复制




使用场景
1  |  | 
优点
1  |  | 
缺点
1  |  | 
分代收集
Java堆内存
新生代
1  |  | 
老年代
1  |  | 
经典垃圾收集器
STW
1  |  | 
Serial收集器
1  |  | 
运行示意图

Serial Old收集器
1  |  | 
运行示意图

ParNew收集器
1  |  | 
运行示意图

注意
1  |  | 
Parallel Scavenge收集器
1  |  | 
特点
1  |  | 

参数设置
1  |  | 
Parallel Old收集器
1  |  | 
运行示意图

CMS收集器
1  |  | 
特点
1  |  | 
运行过程
- 初始标记
 
1  |  | 
- 并发标记
 
1  |  | 
- 重新标记
 
1  |  | 
- 并发清除
 
1  |  | 
运行示意图

缺点
1  |  | 
Garbage First收集器
1  |  | 
适用场景
1  |  | 
理解
1  |  | 
TAMS
1  |  | 
SATB
1  |  | 
运行过程
- 初始标记
 
1  |  | 
- 并发标记
 
1  |  | 
- 最终标记
 
1  |  | 
- 筛选回收
 
1  |  | 
运行示意图

Young Collection
Young Collection + Concurrent Mark
Mixed Collection
相关参数
1  |  | 
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!