00:00
大家好,今天给大家来讲一下。强弱。软幻想应用这四个应用。今天的每日疑问是强应用。软应用、弱应用、幻想应用有什么区别?具体的使用场景是什么?咱们分别从这两个角度,然后来分析一下。然后结合实例。强语是什么?强语就是我们平时最常见的像然后那个,然后等于对。这就是我们,呃,平常最常用的一个,就是所说的你有一个对象。这就是一个强应用。垃圾收集器呢,他不会去主动的去碰这些对象,就是不会主动的去回收这些东。对于一个普通的对象呢,就是如果没有其他的引诱关系。只要是超过了。呃,引用的应用域或者显示的将这些然后复制为空的话,应该他就可以被垃圾收集器收集了。就是这句话是什么意思啊。
01:00
给大家解释一下,你看。在第一行的时候,我们使用这个对象,对吧,你又出来一个对象。然后在第四五行。在这些呃,省略的行业里面呢,我们可能会用到这个的这个对象。然后呢,他就不会。他是不会被收集的,对吧。然后我们可以如果想要,就是如果他不用了,我们怎么办,我们可以复制为空。这样的话,他在接下来这个使用当中呢,呃,如果内存不够了,或者是怎么样,它根据这个具体的这个回收机制。还有这个垃圾收集策略,他可能会就会被收集,被这个垃圾收集器给收集了。其实就是这么一个意思。改善强饮用的方法是什么?呃,就是如果强引用在方法的内部。该怎么办,如果在方法内部的话,就是当这个因为这个程序的话。
02:01
他是就是从上往下执行的,对吧,当他执行完之后。这个里边的这个就会,嗯。呃,大运河我在第二行就是引用了这次人才的对象,对吧。然后我在第一七号,他是不是就执行结束了,对吧,到这就执行结束了。那他当这个方法执行结束完之后,它就是呃会被回收。其实就是这么一个意思。嗯,咱们来看一下这个解释,当其引用在方法的内部时,这个引用保存在Java站中。而真正的引用最小保存保存在Java堆中。如果这个方法之前结束了。他就会随呃随之,然后退出方法站,然后这个引用的对象就会被回收。你看如果这个枪引用这个在类中定义的话,会怎么样,在类中的话,其实它就会,呃,永远的就在这儿了,它不会被回收。
03:02
那我们如果想回收了该怎么办?我们就必须要通过。这个给他复制为空。才是可以的。这样的话就相当于对他对这个强引用进行了一个弱化。随后呢,这个GC它就可以进行回收掉,它其实就是刚才所说的,呃,这种情况。我们给它复制一下,复制复制为空,其实还呃。在那个我们都很常见,你像在我们做一个小的补充,在中有一个。方法,然后那个就是也提供了这种回收的机制。如果没有看过它相关的源码的话,也可能不太了解,我们正好来趁这个机会来了解一下。我们知道就是可以使用这个list中的ADD方法,然后向这个list中就是添加数据对吧。这个例子中,其实它是呃,它是怎么存放的数据,它就是呃通过这个数组,而不这这个数组来存放的数据,对吧?
04:08
你这是那个ADD的源码。源码的话,其实我这里给它省略了,呃,省略了有五行,五行代码,然后最关键的代码就是。呃,在下面这些。然后它提供了这个回收的方法如下,就是这个对吧,它就是把它给清空,清空什么,就是清空这个date这个数字对吧。它是这样一个作用。就是呃,咱们来看一下他这个源码,源码怎么写的。先来看一下这个源码,这是他清过的这个源码。首先呢,他。我们来看这个最关键的一个地方,他把每一个,他把数组中的每一个数据,那都给复制了为空。他为什么这样做?他为什么不直接?
05:04
为什么?它为什么不直接复制为element,就是这个等于空呢?他这样不就省事了吗?大家可以思考一下。就是为什么不直接复制为空档,而是把这个。数组。然后直接复呃,而是把每一个数都复制为空。原因是什么?就是原因是这样的,就是下次再调用ADD方法的时候。就可以拿来急用。就不用再重新一个这个数了,对吧,其实它就是这样一个好处。
06:00
然后还有呢,就是。还有一个就是element不是还有一个就是中的一个。呃,这个移除的这个方法就是删除一个元素对吧,删除它的,呃,再一个元素。我们先来看一下它的源代码。原动码也是,就是如果我们删除它的话,它就会在这个位置当中,然后复制维护,其实和这个是一模一样的。那他为什么会这样做?为什么每一个移除的数据都会复制为空?我们直接复制为零不行了吗?或者是复制为其他的。咱可以就是可以思考一下他为什么会这样做。它的原因呢,就是防止你看他说了G对吧,防止这个G。原因就是防止这个内存内存泄露。当的连续这个remove的时候,或者ADD操作的时候,如果不把这个。呃,Remote这个元素质控的话。
07:06
如果不把这个原子复制为空的话,可能会造成。嗯,会造成不能及时被JC的情况。引用的就一直在引用,所以会造成内存泄露的情况。他是这么一个意思。我们再来看一下这个软引用。软引用的话,就是用来描述一些有用但不必须的对象。什么意思,就是呃,是对一种相对强引用。弱化的一些应用。可以让对象豁免一些垃圾收益器,只有当GM认为内存不足时,才会去试图回收。呃。引用指向的对象。你看如果就是我们在使用这个软件应用的时候。如果内存不足了,他才会去回收这些东西。他就是一种弱化的一个强行对吧,强行的话就是不会不会主动的去回收。
08:03
而若诶,而这个呃软引用的话,就相当于强烈引用的话。就是如果没有内存的话,会发生OM的话,它就会。进行回收。其实就是这么一个意思。软银用通常用来实现内存敏感的缓存。如果还有空闲内存就可以呃暂时保留内存,当内存不足的呃时候,然后再清理掉,这样就保证了使用缓存的时候。俺不会耗尽内存。我们看一下,呃,这个事例。实际其实就是这样的,没什么好好讲的。在中间那。这就是。呃,其实这就是一个原因,如果他如果当内存不足的时候,他会主动的去回收这个。被这个top的,让我这个给包含的这个对象。引用的引用的引用的对象。
09:01
我们再来看一下这个rain。若隐的话,就是也是用来描述非必须的对象。当GM进行垃圾回收时,无论内存是否充足。若引用,关联的对象都会被回收。你看并不能使用对象豁免垃圾收器仅仅是提供一种。访问在弱引用状态下对应的途径。这就可以用来构建一种没有特殊约定约束的关系。比如。呃,维护一种非强制的映射关系,然后如果试图获取这个对象的还在的话,那就使用它,否则的话就实例化。这样的话就是你看很多缓存的实现啊,也是那个很多缓存也是这样实现的。你可以看一下这个。单利模式它的话。
10:00
你看我们就。呃,如果想写一个这个学学生的帮助类,对吧。然后我们想每一次都获取这个类。然后我们想保证他的这个。大力的话。该怎么做?我们可以写一个这个帮助的这个方法,对吧,然后每一次我们只获取他的,相当于把这个给拿到了。然后为了我们保证它是3D的,我们可以判断一下是否为空。如果等于空的话,我们就把它给扭出来,如果不等于空的话,我们直接返回即可。这样的话就保持这个大力,你看。其实也是符合他这种形式的,应该。如果获取的对象还在,就使用它,是不是就是符合这个,否则的话就重新实例化,是不是符合这个。所以呃,我按照我个人的理解,它是符合这种单利的模式。还有呢,就是这种缓存,刚才也提到了,它是很多缓存的选择,神仙缓存的选择。同样,我们是一个学生的帮助类。
11:02
我们呢,首先呢,我们要缓存这个学生的这个信息。我们可以使用这种map地吧?每一次查询这个K的时候,首先呢,先去。判断一下这个缓存它是不是存在,如果存在的话。就直接返回,如果不存在的话。这是不是如果不存在的,如果不存在的话,就先去查一下数据库。查完数据库之后,然后再把它缓存起来。这样的话,在最后再返回来。这又实现了一个缓存。这是弱引用的一个事例。嗯,就是我们可以看一下。这个弱引用其实就是这样的,导致说你们可以去做一下这个实验。就是我们一开始是。这个就是热引用,然后引用的一个对象对吧。然后呢,我们先get一下,然后你看它打印的是ABC对吧,它就可以把这个对象这中的这个。
12:05
呃,只是数据该拿到。这样的话,然后接下来我们通知这个JC,然后进行回收的。他就答应为空了,所以他是不存在的,对吧。第二个输出为空。说明只要GM进行回收。然后被弱化,被弱引用,关联对象必定是会被回收的。啊,不过需要注意的是,这里所说的这种。呃,弱引用关联对象只是指弱引用与值关联。如果存在强应用同时与之关联的话。对象。呃,则进行垃圾回收,也不会对该手数据进行回收,什么意思,你看。我们刚才是不是直接在这里进行了一个。直接写了个newsre。它就会被回收,但是呢,如果我们把这个提到上面的话,它就不会被回收,因为这样的话,它就相当于是一个强影。
13:04
可以看到两次他都是ABC。所以就是这个垃圾收集的时候,它是没有起作用的。我们再来看一下最后一个,这个血用。如果一个对象与虚有关联。则没有跟引用与之关联的话。啊,在任何时候都可能会被垃圾回收回收。那我们直接来看一下吧,就是在使用它的时候。必须使用这个应用队列,必须和这个引用队列联合使用。你看我们可以,我们需要先创建一下队列,然后再创建一下这个虚拟。那这样的话。他才能联合使用。
我来说两句