判断对象可以回收:
引用计数法:
只要一个对象被其他引用,计数就会增加,如果没有引用了,计数就为0,可以被回收。
但存在循环引用时,就无法进行垃圾回收。
可达性分析算法:
根对象——肯定不能被当作垃圾的对象
扫描堆中的对象,虚拟机的垃圾回收器沿着GC root对象为起点的引用链来找到该对象,找不到,表示可以回收。
哪些对象可以作为GC root?
system class系统类,native stack底层本地方法,busy monitor锁的监控,thread线程。
四种引用:
强引用:沿着GC Root能够到达的对象 就不会被回收。
软引用:垃圾回收时,内存不够的时候 就会把软引用的对象回收
弱引用:垃圾回收时,弱引用的对象直接回收(不管内存够不够)
引用队列:软(弱)引用的对象被回收后,它们自身就会进入引用队列,来释放它们的内存。
虚引用:创建bytebuffer的时候,会创建一个虚引用的对象cleaner,未来bytebuffer被回收后,虚引用对象进入引用队列,一个referencehandler线程会到引用队列中找新入队的cleaner,来调用clean方法。clean方法根据它的地址来调用unsafe.freeMemory方法释放直接内存。
终结器引用:对象的finalize()方法 来自Object父类,没有强引用后,虚拟机对该对象创建终结器引用,放入引用队列,优先级很低的线程finalize根据终结器引用的地址,找到该对象调用finalize,下次GC就会清理掉它。
垃圾回收算法:
1. 标记清除算法:先标记,后清除,清除速度快。容易产生碎片(内存不连续)
2. 标记整理算法:没有内存碎片。把可用的部分向前移动,整