当前位置: 首页> 教育> 幼教 > 强引用 软引用 弱引用 虚引用 以及WeakHashMap简单介绍

强引用 软引用 弱引用 虚引用 以及WeakHashMap简单介绍

时间:2025/7/12 5:53:27来源:https://blog.csdn.net/weixin_41987908/article/details/139424506 浏览次数:1次

一:强引用 软引用 弱引用 虚引用

1:强引用

强引用是最常的引用方式:

Integer a = 1

变量a强引用Integer对象为1值,任何对象被强引用不会被垃圾回收掉。

2:软引用

一个对象是软引用且不可达,不会被垃圾回收器回收直到jvm虚拟机内存不够时候,下面创建软引用案例:

Integer a = 1;
SoftReference<Integer> soft = new SoftReference(a);
//只要为nul就会保证不可达
prime = null;

3:弱引用(代码实操看WeakHashMap)

弱引用对象会被垃圾回收器立即回收,垃圾回收不会等到需要内存时候,下面弱引用2个案例。

案例1:利用WeakReference使得对象不可达

Integer a = 1;
WeakReference<Integer> integerWeakReference = new WeakReference<>(a);
//只要为nul就会保证不可达
a = null;

如果a = null 之后再integerWeakReference.get(),这个就不是不可达了,那弱引用就不复存在了!!!

案例2:对象直接为null弱引用

Integer a = new Integer(1);
//只要为nul就会保证不可达
a = null;

a设置为nulla对象将会被垃圾回收在下个垃圾回收周期中,因为这里没有其他强引用指向它。

弱引用作为key存在WeakHashmap中。

4:虚引用

(1):简介

虚引用应该可以说是最弱的一种java对象引用方式,其它的引用方式至少还能get到对象,而虚引用的句柄是获取不到对象的。

// 新建一个对象
User obj = new User();
// 存储被回收的对象
ReferenceQueue<User> QUEUE = new ReferenceQueue<>();
// phantomReference使用虚引用指向这个内存空间
PhantomReference<User> phantomReference = new PhantomReference<>(obj, QUEUE);

到此我们的句柄PhantomReference就通过虚引用指向了新建的User对象,当我们尝试通过句柄获取这个对象时,是取不到的:

System.out.println(phantomReference.get()); // 获取不到 打印为null

(2):作用

虚引用的作用就是在对象被GC回收时能得到通知,如何通知呐?就是在对象被回收后,把它的弱引用对象(PhantomReference)存入ReferenceQueue对列中,这样我们查看队列就可以得知某个对象被GC回收了。说白了,虚引用的存在意义就是监控对象是否存活

(3):代码实操

//------PhantomReference----start虚引用
// 新建一个对象,开辟一个内存空间Integer obj = new Integer(3);// 存储被回收的对象的虚引用对象ReferenceQueue<Integer> QUEUE = new ReferenceQueue<>();Reference<? extends Integer> qqpoll = QUEUE.poll();System.out.println("--new ReferenceQueue --:"+qqpoll);//输出:--new ReferenceQueue --:null// phantomReference使用虚引用指向这个内存空间PhantomReference<Integer> phantomReference = new PhantomReference<>(obj, QUEUE);// 释放这个内存空间,此时只剩phantomReference通过虚引用指向它obj = null;// 调用gc回收new User的内存空间System.gc();// 被清除的队列中取出被回收的对象while (true) {//回收时把元素放入ReferenceQueue是需要一定时间的,所以Thread.sleep(10000);Thread.sleep(10000);Reference<? extends Integer> poll = QUEUE.poll();System.out.println("--new ReferenceQueue --:"+poll);}/*** 输出:* --new ReferenceQueue --:null* --new ReferenceQueue --:java.lang.ref.PhantomReference@5e3a8624* --new ReferenceQueue --:null* --new ReferenceQueue --:null* --new ReferenceQueue --:null* --new ReferenceQueue --:null*/

从这里while(true)第二次循环输出发现,回收后把虚引用元素放入到ReferenceQueue中了。输出完回收后再循环就直接输出
--new ReferenceQueue --:null了。第一次这样输出是因为时间短还没有开始回收,需要一定的时间才行!!

二:WeakHashMap简介(弱引用)

1:简介

使用它可以实现简单缓存,并不建议线上环境使用它来,这里只是来帮助理解weakHashmap原理,WeakHashMap 是用哈希表实现 Map接口,keyWeekReference类型(弱引用类型),EntryWeakHashMap被自动删除当key不在被使用时候(即不可达时,Sysytem.gc()时给足时间会回收),意味着key对象没有被引用,垃圾回收线程会回收key对象,Entry会从map中移除,因此WeakhHashMap是另外一种实现Map接口。但是比起HashMap还是性能要低!!!

2:代码实操

//WeakHashMap 弱引用的代表,只是key对象(放到堆里里面的,不能是基本数据类型String key = "1" 这种)是弱应用,value是强引用。
//当弱引用不可达也就是后续没有调用了,那就是不可达意味这个可以自动回收
//但是这种比起HashMap来说性能低下
WeakHashMap<String, String> weakHashMap = new WeakHashMap<>();
String key1 = new String("1");
String key2 = new String("2");
weakHashMap.put(key1,"2");
weakHashMap.put(key2,"4");
System.out.println("weakHashMap.size():"+weakHashMap.size());
//weakHashMap.size():2
//改为弱引用
key1 = null;
System.gc(); // 提示JVM进行垃圾回收,但不保证立即执行
System.out.println("1 System.gc():"+weakHashMap);
//输出:1 System.gc():{2=4}
// 为了确保回收发生,我们可以进行几次尝试性的垃圾回收
key2 = null;
for (int oo = 0; oo < 5; oo++) {System.gc();try {// 给垃圾回收器一点时间来工作Thread.sleep(10000);} catch (InterruptedException e) {e.printStackTrace();}
}
System.out.println("2 System.gc():"+weakHashMap);
//输出:2 System.gc():{}
关键字:强引用 软引用 弱引用 虚引用 以及WeakHashMap简单介绍

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: