转自:https://www.cnblogs.com/xiaoxi/p/6486852.html (感觉GC写的还蛮好)
引用的传统定义:如果引用类型的数据中存储的数值代表的是另一块内存的起始地址,这就是一个引用。
在最开始JAVA 1.2的时候,java的引用只是泛泛的定义,只有引用和被引用。
但是我们希望描述一类对象:如果内存空间足够大,能保存在内存中;
如果内存空间在垃圾回收之后还是很紧张,则扔掉这些对象。
所以引用分为了 强引用,软引用,弱引用、虚引用 (依次递减 强 软弱 虚 )
1、强引用
代码中普遍存在的类似"Object obj = new Object()"这类的引用,只要强引用还存在,垃圾收集器永远不会回收掉被引用的对象。也就是生成的实例对象。
2、软引用
描述有些还有用但并非必需的对象。在系统将要发生内存溢出异常之前,将会把这些对象列进回收范围进行二次回收。如果这次回收还没有足够的内存,才会抛出内存溢出异常。Java中的类SoftReference表示软引用。
3、弱引用
描述非必需对象。被弱引用关联的对象只能生存到下一次垃圾回收之前,垃圾收集器工作之后,无论当前内存是否足够,都会回收掉只被弱引用关联的对象。Java中的类WeakReference表示弱引用。(也就是弱引用的生命周期 都是一个GC周期? )
4、虚引用
这个引用存在的唯一目的就是在这个对象被收集器回收时收到一个系统通知,被虚引用关联的对象,和其生存时间完全没关系。Java中的类PhantomReference表示虚引用。(无用对象,一定回收 那么 还会受到系统的通知)
(其实看下面的图就很明了)