JVM垃圾回收详解

[toc]

首先要明确的是,JVM垃圾回收器主要工作区域是堆,目前垃圾收集器都采用了分代垃圾回收算法,因此Java堆被划分成了多个不同的区域。

本文介绍JDK1.8以后的版本:堆分为新生代、老年代,永久代已被元空间(MetaSpace)代替,且不再存在于堆上。

堆的结构

事实上,不同的垃圾回收器所使用的堆模型的具体划分是不同的。但总体分为新生代和老年代,新生代分为Eden区和S(Survivor)区。

以下是传统的

  • G1之前,大对象存放在Old区,但G1开始单独划分了Humongous区存放大对象。
如何判断哪些对象需要回收
1. 引用计数法

就是给对象增加一个引用计数器:

  • 每有一个地方引用该对象,计数器+1
  • 每当一个引用失效,计数器-1
  • 计数器的值为0,说明对象不被引用,可以回收

缺陷:如果有两个对象相互引用,它们的计数器永不为0,也就是说无论是否有用,它们永远都不会被回收。

2. 可达性分析
引用类型
  • 强引用:
  • 弱引用:
  • 虚引用:
  • 软引用:
垃圾收集算法
CMS收集器
G1收集器
ZGC收集器