1. 判断对象是否存活
判断对象存活的方式:
- 引用计数算法:会发生循环引用问题
- 可达性分析
在 Java 中可作为 GC Roots 的对象有:
- 方法区中类静态属性引用的对象。
- 方法区中常量引用的对象。
- 虚拟机栈(本地变量表)中引用的对象。
- 本地方法栈 JNI(Native方法)中引用的对象。
finalize 理论上可以把对象拯救,但是不保证 finalize 一定执行。
2. 引用类型
- 强引用 =
- 软引用 SoftReference
- 弱引用 WeakReference
- 虚引用 PhantomReference
3. 垃圾回收基础
垃圾回收类型:
- Minor GC
- Full GC
GC 算法:
- 复制
- 标记-清除
- 标记-整理
复制算法:
优点:
- 简单高效,不会出现内存碎片问题。
缺点:
- 内存利用率低,只有一半。
- 存活对象较多时效率明显会降低。
标记清除:
优点:
- 利用率百分之百
缺点:
- 标记和清除的效率都不高(比对复制算法)
- 会产生大量的不连续的内存碎片
标记整理:
优点:
- 利用率百分之百
- 没有内存碎片
缺点:
- 标记和清除的效率都不高
- 效率相对标记-清除要低
4. 垃圾回收器
新生代垃圾回收算法:
老年代垃圾回收算法:
垃圾回收器有单线程、多线程回收器。
其中的并行和并发是:
- 并行:垃圾收集的多线程的同时进行。
- 并发:垃圾收集的多线程和应用的多线程同时进行。
5. CMS
CMS 同时存在并行收集、并发收集。
初始标记:暂停用户线程
并发标记:与用户进程同时进行
重新标记:暂停用户进程
并发清除:与用户进程同时进行
CMS 缺点:
- CPU 资源敏感:因为并发标记过程会消耗很多 CPU。
- 会产生浮动垃圾:在并发清理时用户线程同时会产生垃圾,所以不能在垃圾满了没有内存之后再进行回收,要预留一部分内存,比如 JDK6 在老年代占用达到 92% 就回收。
- 会产生内存碎片:因为 CMS 使用标记清除算法。
6. G1
内存布局改变:化整为零。
G1 特点:
- 空间整合,不会产生内存碎片
- 可设置参数控制垃圾回收时的停顿时间,尽可能做到
G1 的垃圾回收模式:
- Young GC
- Mixed GC
Mixed GC 过程:
7. Stop The World
暂停所有用户线程。