你不知道的Java引用

什么是引用

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

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

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

强引用

特点

回收

使用场景

Unsupported markdown: list
Unsupported markdown: list
Unsupported markdown: list
Unsupported markdown: list
Unsupported markdown: list
Unsupported markdown: list
Unsupported markdown: list
Unsupported markdown: list
Unsupported markdown: list

软引用

特点

回收

使用场景

例子

Unsupported markdown: list
Unsupported markdown: list
Unsupported markdown: list
Unsupported markdown: list
Unsupported markdown: list

1.1 String str = new String('hh');
SoftReference soft = new SoftReference(str);
str = null; //有可能被回收,则返回null
String str2 = soft.get()

Unsupported markdown: list

2.1 二级缓存缓解Redis缓存的压力

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); //重建软引用
}

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

弱引用

特点

回收

使用场景

例子

Unsupported markdown: list
Unsupported markdown: list
Unsupported markdown: list
Unsupported markdown: list

3.第二次垃圾回收时回收

Unsupported markdown: list

2 有价值的被cache

Unsupported markdown: list
Unsupported markdown: list

Thread Local 就是弱引用

WeakHashMap中的key就是弱引用

虚引用

特点

回收

使用场景

例子

任何时候被回收

幽灵引用

任何时候都可能被垃圾回收器回收

Unsupported markdown: list

2 对象销毁前,资源释放

Unsupported markdown: list
Unsupported markdown: list

代替Object.finalize方法释放资源




归类总结

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

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

posted @   远方有你,伴余生  阅读(386)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
0
点击右上角即可分享
微信分享提示