1. 如何判断垃圾可以回收
可达性分析算法:扫描堆中的对象,沿着GC Root对象为起点的引用链看能否找到该对象,如果能则其仍然存活,不能则判定为可回收的对象。
2. 五种引用(由强至弱)
- 强引用:传统的正常引用,只要引用关系还在,就不会被回收
- 软引用:在系统将要内存溢出前,会把这些对象进行二次回收,如果回收后还是没有足够内存,才会抛出内存溢出异常
- 弱引用:当垃圾回收器开始工作时,就会回收弱引用关联的对象
- 虚引用:为一个对象设置虚引用,在该对象被回收是会收到一个系统通知,是否有虚引用不会对其生存时间有影响。虚引用Cleaner,在ByteBuffer对象被回收后,其占用的直接内存地址还在,此时把虚引用Cleaner放到引用队列,执行Unsafe.freeMemory来释放直接内存。
- 终结器引用(补):当对象被垃圾回收时,把对象加入引用队列(入队等待),之后通过终结器引用找到待回收的对象,调用对象的finalize()方法。注:由于处理引用队列线程优先级很低,所以不推荐用finalize()会回收对象。
3. 垃圾回收算法
(1)标记清除:先标记,然后清除,清除时就是把对象的起终地址记入空闲地址队列
优点:速度快 缺点:产生内存碎片
(2)标记整理:先标记,再把剩余的对象紧凑到一起
优点:解决了外部碎片 缺点:速度较慢
(3)标记复制:将内存划分出大小相等的两块,其中一块为原始,一块空白,把存活的对象复制到空白区(移动堆指针,按序分配无碎片)
优点:无内存碎片,高效 缺点:占用太多空间
JVM 垃圾回收
原文:https://www.cnblogs.com/Kinghao0319/p/14460136.html