江的福的小本本之引用

整体架构:
在这里插入图片描述

1、强引用(默认支持模式)

当内存不足时,jvm进行垃圾回收,但是对于强引用的对象,jvm宁愿造成OOM,也不会回收强引用对象。
因此它经常是造成内存泄漏的主要原因之一。
代码说明:

public static void main(String[] args) throws InterruptedException {
       Object o =new Object();//这样的默认定义就是强引用
       Object o1 =o;//赋值
       o=null;//置空
       System.gc();
       System.out.println(o1);
       System.out.println(o);
    }

在这里插入图片描述
可以看到o1并没有被回收。

2、 软引用

内存足够的前提下不收,但是内存不够时会回收。
通常用在一些堆内存敏感的程序中,比如说高速缓存。
依旧代码说话:
先说在内存充足时。在这里插入图片描述
在main中调用这个方法,结果为:
在这里插入图片描述
即softReference没有被回收。
然后我们对堆内存空间进行一些骚操作在这里插入图片描述
再看:
在这里插入图片描述
在这里插入图片描述
可以看到在内存空间不足的情况下,它已经被回收了。

3、弱引用

一旦gc,直接回收,不考虑内存。
在这里插入图片描述
在这里插入图片描述
要注意,在这里,我并没有操作内存空间,空间是足够用的。

关于软引用或是弱引用都可以适用以下场景:
在这里插入图片描述
弱引用的一个关于hashMap的应用:weakHashMap
我想如果看过hashmap源码的话,应该知道,当数组中存的是一个个的Node节点。来看看下面这段代码。在这里插入图片描述
想一想,这三次分别会输出什么结果。
揭晓答案:在这里插入图片描述
不论key值是否=null,跟map内部其实是没有关系的,因为我们只需要凭借key值运算hashcode,然后经过运算,找到该放node节点的位置即可。与key没有关系的。
再来,如果我们想要及时能够清除掉map,以减小内存,对于对内存敏感的程序,就可以使用WeakHashMap

在这里插入图片描述
直接为大家揭晓;
在这里插入图片描述

4、虚引用

虚引用有多虚?
虚到必须得依靠引用队列,才能回阳,你说虚不虚。
引用队列是什么?它是干嘛的?
问得好,引用队列,就是为这些引用在即将身消道陨的时候,给他们一个庇护所,给他们一个安排后事的机会。
那就先来看看引用队列吧。
以上面的弱引用举例。
还记得吧。弱引用一旦gc结束就一定会被回收。但是如果我们将给它配合一个引用队列呢。
开始操作:
在这里插入图片描述
结果:
在这里插入图片描述
可以看到,在引用队列中它依旧被保存着。
好,接着来看虚引用。

============================
虚引用需要java.lang.ref.PhantomReference 类来实现。

顾名思义,就是形同虚设,与其他几种引用都不同,虚引用,并不会决定对象的生命周期。
如果一个对象仅保持虚引用,那么它就和没有任何引用是一样的,在任何时候都可能被垃圾回收器回收,它不能单独使用,也不能通过它访问对象,虚引用必须和引用队列联合使用。

虚引用的主要作用是跟踪对象被垃圾回收的状态。仅仅是提供了一种确保对象被finalize以后,做某些事情的机制。
PhantomReference的get方法总是返回null,因此无法访问对应的饮用对象。其意义在于说明一个对象已经进入finalization阶段,可以被gc回收,用来实现比finalization机制更灵活的回收操作。

换句话说,设置虚引用关联的唯一目的,就是在这个对象被收集器回收的时候收到一个系统通知,或者后续添加进一步处理。
java技术允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。

=================================
在这里插入图片描述
在这里插入图片描述

小总结:

在这里插入图片描述
在这里插入图片描述

发布了51 篇原创文章 · 获赞 11 · 访问量 1750

猜你喜欢

转载自blog.csdn.net/weixin_45276914/article/details/105552455