范围:要回收哪些区域
在JVM五种内存模型中,有三个是不需要进行垃圾回收的:程序计数器、JVM栈、本地方法栈。因为它们的生命周期是和线程同步的,随着线程的销毁,它们占用的内存会自动释放,所以只有方法区和堆需要进行GC。
前提:如何判断对象已死
引用计数算法
可达性分析算法(根搜索算法)
四种引用
GC在收集一个对象的时候会判断是否有引用指向对象,在JAVA中的引用主要有四种:
强引用(Strong Reference)
软引用(Soft Reference)
弱引用(Weak Reference)
虚引用(Phantom Reference)
finalize() 方法
方法区的回收
各种垃圾收集算法
标记-清除算法
标记-整理(压缩)算法
复制算法
分代收集算法
所有商业虚拟机都采用这种方式,将堆分成新生代和老年代,新生代使用复制算法,老年代使用标记-整理算法
GC 类型
1.Minor GC 针对新生代的 GC
2.Major GC 针对老年代的 GC
3.Full GC 针对新生代、老年代、永久带的 GC
为什么要分不同的 GC 类型,主要是1、对象有不同的生命周期,经研究,98%的对象都是临时对象;2、根据各代的特点应用不同的 GC 算法,提高 GC 效率。
各种垃圾收集器
串行收集器(Serial Collector)
ParNew(Serial 收集器的多线程版本)
并行收集器(Parallel Scavenge)
适用场景:
1.多 CPU、对停顿时间要求高的应用
2.是 Server 端的默认新生代收集器
Serial Old
是 Serial 收集器的老年代版本,依旧是单线程收集器,采用标记-整理算法,
Parallel Old
CMS(并发-标记-清除)
CMS 是一种以获取最短回收停顿时间为目标的收集器。
步骤:
1.初始标记
此阶段仅仅是标记一下 GC Roots 能直接关联到的对象,速度很快,但是会停顿