垃圾收集
对象已死?
引用计数算法
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 协议 ,转载请注明出处!