不知道的java_你不知道的Java引用

什么是引用

引用就是保存着一块地址(门牌号)的对象,就像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');
SoftReference soft = new SoftReference(str);
str = null; //有可能被回收,则返回null
String str2 = soft.get()")

B43("2. 可以实现内存敏感型高速缓存")

B44("2.1 二级缓存缓解Redis缓存的压力")

B45("2.2 Object obj = new Object();
JedisHelper.put(key,obj);
SoftReference sfobj = new SoftReference(obj);
...
if(sfobj.get()!=null) {
Object obj = (Object)sfobj.get();//未被回收
}else {
obj = JedisHelper.get(key);//内存吃紧,被回收
SoftReference sfobj = new SoftReference(obj); //重建软引用
}")

B51("有一个应用需要读取大量的本地图片,如果每次都从硬盘读取,
则会严总影响性能,但是如果全部加到内存中,则可能会内存溢出,
此时使用软引用就可以解决这个问题")

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的垃圾回收器的简称

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值