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