1. 如何判断垃圾
- 引用计数:(Python)如果一个对象被引用一次,引用次数+1。如果没有被引用过,就是垃圾。但是会有循环引用的问题。
- 可达性分析:(Java)
**概念:**扫描堆中的对象,看看是否能以GC Root对象为起点,如果找不到,说明可以回收。
**问题1:**什么对象可以当作GC ROOT呢:栈帧中的局部变量、静态变量常量、JNI引用
2. 五种引用
无论是通过引用计数算法判断对象的引用数量,还是通过可达性分析算法判断对象是否引用链可达,判定对象是否存活都和“引用”离不开关系。
譬如我们希望能描述一类对象:当内存空间还足够时,能保留在内存之中,如果内存空间在进行垃圾收集后仍然非常紧张,那就可以抛弃这些对象——很多系统的缓存功能都符合这样的应用场景。
一共有4张引用:强引用、软引用、弱引用、虚引用
- 强引用:在程序代码之中普遍存在的引用赋值,即类似“Object obj=new Object()”这种引用关系。无论任何情况下,只要强引用关系还存在,垃圾收集器就永远不会回收掉被引用的对象。
- 软引用:垃圾回收后空间还不足,于是就有会释放软引用的对象。通过SoftReference实现软引用
- 弱引用:强度比软引用更弱一些,垃圾下次垃圾回收一定会回收掉,通过WeakReference实现
- 虚引用:它是最弱的一种引用关系。必须配合引用队列来实现一些功能,比如对象回收通知。
3. 垃圾回收算法
三种基本算法
把地址放入空闲地址列表当中。
优点:清理快
缺点:容易产生内存碎片