都知道Java垃圾回收都是交给JVM来处理,什么时机、如何处理了解不多,可以查看此篇文章。如果了解,浏览文章一起交流。分为三个模块:什么样对象需要回收?回收算法有哪些?如何选择垃圾回收器?
java中有了垃圾自动回收机制,让程序员更多的关注业务,不必考虑内存的释放。所以自动垃圾算法就变的很重要了,
如果算法不合理,导致一些内存不释放,从而就导致内存溢出。
一 什么样对象需要被回收?
垃圾回收机制通过一套的有效的算法计算,什么对象有效,什么对象无效。对于无效的对象进行回收。
常见的计算对象的有效无效两种方法:引数计数法、可达性分析算法。
备注:
计算对象是否有效算法和收集垃圾算法是两回事。计算对象是否有效之后,进行对象对象回收的
算法(垃圾回收算法)。
1.1 引数计数法
1. 原理
假设一个对象a,被引用一次,那么a应用计数器会加1。引用失败时,a计算器减1。
当a的计数器的值为0,说明对象a没被引用,可以被回收。
2. 优缺点
优点:
回收的及时性高,因为不会等到内存不足来回收对象,直接根据对象的计数器为0进行回收。
在垃圾回收过程中,应用无需挂起。
区域性,在更新计数器只会影响该对象,不会扫描全部对象。
缺点:
每次对象应用,去更新计数器,有一点时间开销。
无法解决循环引用。
1.2 可达性分析算法(重点)
一系列称为“GC Roots”的根对象作为起始节点集。如果某一个对象到节点集没有引用,则称该对象不可达,
可以被回收。
1. 在虚拟机中被成为GC Roots对象有哪些?(了解)
a 虚拟机栈中的引用对象。
b 方法区中,静态属性引用对象。
c 方法区中,常量引用对象。
d 本地方法栈中JNI引用对象。
e 同步锁持有对象
f Java虚拟机内部的引用。
2. 对象的引用
强引用:不会被回收。
软引用:内存发生泄漏之前,会进行二次回收。如果这次回收没有足够内存,抛出内存溢出异常。
弱引用:活到下一次垃圾回收为止。
虚引用:无法通过一个虚引用获取对象,虚引用唯一目的就是,对象被回收时,收到一个系统通知。
二 垃圾回收算法有哪些?
2.1 标记清除
1. 原理
分为两个阶段,标记和清除。
标记:从根节点标记被引用对象。
清除:未被标记的对象为垃圾对象,可以被清理。
2. 缺点
执行效率低,在GC需要停止应用程序。而且在标记和清除都需要对所有对象便利。
内存碎片化计较严重,因为无效的对象被