什么是引用

  引用就是保存着一块地址(门牌号)的对象,就像C语言的指针那样,引用可以传递某个数据的地址,如果我们想拿到某一条数据,就要先找到他的地址,然后告诉计算机我去拿这个地址的数据,最后计算机就会去磁盘拿到我们要的数据。

  其实,在学Java的时候我们就知道了Java的类型可分为基本类型与引用类型
java基本类型有int,shout,long,float,double,byte,char,boolean;
java引用类型:除了基本类型基本都是,例如:对象,数组;
  但是我们不断的增加引用,就要不断的消耗内存空间,最后就容易内存溢出和泄漏,所以为了适应不同的场景,Java将引用分为强引用,弱引用,软引用,徐引用4种不同的类型方便垃圾回收,这样我们就知道那些引用什么时候你要用的,那些是不用准备回收的。总结一句话,Java引用分类的目的是为了对垃圾回收的进一步优化。

下面是对Java不同引用特点、使用场景的举例

graph LR A1(强引用) A2(特点) A3(回收) A4(使用场景) A21("1. 空间不回收") A22("2. 虚拟机抛出OutMemoryError也不回收") A31("1. 显示赋值为空") A32("2. 强引用转为软引用") A33("3. 方法局部强引用变量") A34("4. 方法栈退出引用不存在时") A41("1. 全局配置变量") A42("2. 方法栈局部变量") A43("2. 方法栈返回对象或强引用逃逸") A1---A2 A2---A21 A2---A22 A1---A3 A3---A31 A3---A32 A3---A33 A3---A34 A1---A4 A4---A41 A4---A42 A4---A43
graph LR B1("软引用") B2("特点") B3("回收") B4("使用场景") B5("例子") B21("1. 空间不足就回收") B22("2. 关键词:SoftReference") B31("1. 空间不足,易被回收") B32("2. 空间足够,不会回收") B41("1. 使用例子") B42("1.1 String str = new String('hh');<br> SoftReference soft = new SoftReference(str);<br>str = null; //有可能被回收,则返回null <br> String str2 = soft.get()") B43("2. 可以实现内存敏感型高速缓存") B44("2.1 二级缓存缓解Redis缓存的压力") B45("2.2 Object obj = new Object();<br>JedisHelper.put(key,obj); <br> SoftReference sfobj = new SoftReference(obj); <br> ... <br> if(sfobj.get()!=null) { <br>Object obj = (Object)sfobj.get();//未被回收 <br>}else { <br> obj = JedisHelper.get(key);//内存吃紧,被回收 <br> SoftReference sfobj = new SoftReference(obj); //重建软引用 <br> }") B51("有一个应用需要读取大量的本地图片,如果每次都从硬盘读取,<br> 则会严总影响性能,但是如果全部加到内存中,则可能会内存溢出,<br> 此时使用软引用就可以解决这个问题") B1---B2 B2---B21 B2---B22 B1---B3 B3---B31 B3---B32 B1---B4 B4---B41 B4---B42 B4---B43 B4---B44 B4---B45 B1---B5 B5---B51
graph LR C1("弱引用") C2("特点") C3("回收") C4("使用场景") C5("例子") C21("1. 发现就回收") C22("2. 何时回收不确定") C31("1. 被扫描到就回收") C32("2. 生命周期短暂") C33("3.第二次垃圾回收时回收") C41("1. 避免手动置空") C42("2 有价值的被cache") C43("3. 很容易被重新构建") C44("4. 很消耗内存的对象") C51("Thread Local 就是弱引用") C52("WeakHashMap中的key就是弱引用") C1---C2 C2---C21 C2---C22 C1---C3 C3---C31 C3---C32 C3---C33 C1---C4 C4---C41 C4---C42 C4---C43 C4---C44 C1---C5 C5---C51 C5---C52
graph LR D1("虚引用") D2("特点") D3("回收") D4("使用场景") D5("例子") D21("任何时候被回收") D22("幽灵引用") D31("任何时候都可能被垃圾回收器回收") D41("1. 虚引用大多被用于引用销毁前的处理工作") D42("2 对象销毁前,资源释放") D43("3. 精细的内存使用控制") D44("4. 标记虚引用,已准备好回收") D51("代替Object.finalize方法释放资源") D1---D2 D2---D21 D2---D22 D1---D3 D3---D31 D1---D4 D4---D41 D4---D42 D4---D43 D4---D44 D1---D5 D5---D51



归类总结

引用类型 被回收时间 用途 生存时间
强引用 从来不会 对象的一般状态 jvm停止运行时终止
软引用 在内存不足时 对象缓存 内存不只是终止
弱引用 在垃圾回收时 对象缓存 Gc运行后终止
虚引用 在任何时候时 释放资源 Gc运行后终止

GC即使Java的垃圾回收器的简称