JVM垃圾回收详解
JVM垃圾回收详解
[toc]
首先要明确的是,JVM垃圾回收器主要工作区域是堆,目前垃圾收集器都采用了分代垃圾回收算法,因此Java堆被划分成了多个不同的区域。
本文介绍JDK1.8以后的版本:堆分为新生代、老年代,永久代已被元空间(MetaSpace)代替,且不再存在于堆上。
堆的结构
事实上,不同的垃圾回收器所使用的堆模型的具体划分是不同的。但总体分为新生代和老年代,新生代分为Eden区和S(Survivor)区。
以下是传统的
- G1之前,大对象存放在Old区,但G1开始单独划分了Humongous区存放大对象。
如何判断哪些对象需要回收
1. 引用计数法
就是给对象增加一个引用计数器:
- 每有一个地方引用该对象,计数器+1
- 每当一个引用失效,计数器-1
- 计数器的值为0,说明对象不被引用,可以回收
缺陷:如果有两个对象相互引用,它们的计数器永不为0,也就是说无论是否有用,它们永远都不会被回收。
2. 可达性分析
引用类型
- 强引用:
- 弱引用:
- 虚引用:
- 软引用:
垃圾收集算法
CMS收集器
G1收集器
ZGC收集器
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 LemontreeN's!