强引用
Strong reference就是我们常见的引用指向一个对象,只要强引用指向一个对象,就能表明对象还活着,垃圾收集器就不会碰这种对象
软引用
Soft reference一种相对强引用弱化的一种引用,当JVM认为内存不足时,才会试图去回收软引用。JVM会确保在OOM之前,清理软引用指向的对象,
可以和一个引用队列联合使用,如果软引用所引用的对象被垃圾回收器回收,Java虚拟机会把这个软引用所引用的对象加入到与之关联的引用队列中,后续,我们可以调用RefrenceQueue的poll()方法检测是否他关心的对象被回收了,如果队列为空,将返回一个null,否则该方法返回队列中前面的一个Reference对象
应用:图片使用缓存
弱引用
Week reference提供一种访问在弱引用状态下对象的途径,引用生命周期比弱引用短,在垃圾回收线程扫描他所管辖的内存区域过程中,一旦发现了具有弱引用对象,不管当前内存空间足够与否都会回收他。弱引用也可以和引用队列联合使用
应用:静态内部类中,经常会使用虚引用,列如:一个类发送网络请求,承当callback的静态内部类,则常以虚引用的方式来保存外部类的引用,当外部类需要被jvm回收时,不会因为网络请求没有及时回来,导致外部类不能被回收、引起内存泄露
幻象引用(虚引用)
不能通过他访问对象,仅仅是提供了一种确保对象被finallize以后,做某些事情的机制。如果一个对象持有虚引用,那么他和没有任何引用一样,在任何时候都可能被垃圾回收器回收,必须和引用队列联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中
程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。如果程序发现某个虚引用,已经被加入到引用队列,那么久可以在所有引用的对象的内存被回收之前采取一些行动
当一个虚引用关联的对象被垃圾收集器回收之前会收到一条系统通知
对象的可达性
GC就是依据这种可达性来回收对象的,如果错误的保持强引用(比如,赋值给了static变量),那么对象可能就没有机会变成类似弱引用的状态了,就会产生内存泄露