Java-垃圾回收(JVM)

96 阅读3分钟

引用计数器

给对象加一个引用计数器,当被引用时计时器加1,当引用失效时计时器减1,任何时刻对象计数器是0时表示对象不再使用,jvm可以回收。

缺点:难解决循环引用的问题。

比如:A调用B,B调用A 但是A和B这一堆,没有再被其他引用,所以他是一堆垃圾需要回收。

可达性分析算法

通过名为GC ROOT的对象作为起点,从这个节点向下搜索,搜索所经过的路径称为引用链,当一个对象和gc root没有任何引用链时(就是从GC ROOT到该对象不可达),则称为对象不可用。

强引用

强引用:是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。就比如强引用是你身边最离不开的物品,不管任何时候你都不可能把这种物品当垃圾回收掉。 new的对象都是强应用:Object o = new Object();当内存不足时,宁愿抛出内存溢出OutOfMemoryError也不会回收。

软引用

软引用:还有用,但并非必须的对象,再将要发生内存溢出时,才会列入回收计划回收,如果回收完,还没有足够的内存,则会发生内存溢出错误。就像你身边想丢又觉得有用的物品,当你屋子宽敞时你留着不丢,当你打扫房间发现房间拥挤需要整理空间的时候,就会丢掉这些软引用物品给屋子腾空间,以防止屋子拥挤。

弱引用

弱引用:只能生存到下次垃圾回收之前,下次回收不管内存够不够都会回收弱引用的对象,就像你屋子里面的垃圾,只能生存到你下次打扫卫生的时候,只要打扫卫生进行垃圾回收,你就会回收弱引用的对象把垃圾回收清理掉。

虚引用

虚引用:一个对象是否有虚引用,完全不会对其生存时间造成影响,目的:就是希望在这个对象被收集器回收时,收到一个系统通知,虚引用必须和引用队列(ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。判断引用队列虚应用被回收的事件可以对堆外内存进行回收(可能不准确)。

总结

Java中4种引用的级别由高到低依次为:强引用 -> 软引用 -> 弱引用 -> 虚引用。 关于垃圾回收未完待续......