00:00
好,同学们,我们继续通过前面的强软弱需四大引用,我们也明白了在内存够和不够的前提下,启动Java GC垃圾回收机制以后对这四种引用的各自影响。那接下来明白这个基础知识以后,我们就要给大家说到说说为什么N。它要继承弱引用,用强引用行不行?为什么要用弱引用?好,那么我们来看一下。先看这么一个代码啊,那这呢,也是我这儿这个写过来的。我这儿在这个main方法里面,随便哪个方法都可以啊,随便写一个他这儿啊。Local TL,这是第一行,我在这个方法里面就定义了一个所local,相当于是一个变量啊,注意它是所local,是个单独的类。第二个set和get,那么来,比如说你这个设置一个值啊,这是杨哥的邮箱啊,同学们可以给我发邮件,有疑问好吧,那么来这个是个什么get,获得我们设的值很简单,那下面的问题是他为什么要用弱引用走起。
01:06
我们第一行新建那个local的对象TL是一个强引用,这个东西我们说过,一般我们六出来的,不加特别说明哈,默认就是个强引用。那么lie第二行调用这个set,新建一个N垂,通过源码就可以知道这里面的K是弱引用,指向这个对象整体的架构,相当于这个方法上的战争。定义了这是一个什么,左边等号,左边这个TL是不是叫一个引诱它呢?尿过来的是一个强引用,好,那么接下来我们晓得了。这个线程其实底子是调local对象里面的local map,而这个map又是个N垂,N垂就是一个KB键值,对,而这个T是以弱于用的形式存在,指向了我们的s local,那么这块的话呢,我们弟兄们没有任何问题,对吧?下面我们的问题来了,为什么这要用弱引用呢?
02:00
来。首先当我们这个方法假设执行完了啊,战争销毁强引用TL也就没了,我这儿我们都明白。Main方法如果运行到这一行,在方法里面定义的局部变量是不是也就弹出去出站了,那么它应该被销毁好,如果此时这个里面的某个entry的key,这个引用还指向着这个对象,你要搞清楚啊,我这个线程里面这个销毁了,我这个thread这个线程没了,但是我th local是另外一个类,听到这是两个不同的类,它是有自己的。想法的,那么我们这儿可以看,如果这个key的引用是一个强引用,那么就会导致key指向local对象及V指向的对象不能被GC回收,造成什么内存泄漏,好如因为你这块是强引用,我这也是强引用,一个叫线程里面的。
03:00
一个角。说local map里面的,如果这个强引用断了,你这边也是强引用,大不好意思啊,我断了一半,另外一半可没有跟着走好,那么假设弱引用的话,就会大概率的减少内存泄露的问题,当然这还有一个坑啊,假设这个T为难的这个雷,我们第二个坑呢,我们后面讲,我们先讲第一个坑,为什么弱饮药以及这个内存泄露这个坑,那么所以说我们使用若饮药,若饮用的意思是什么?只要有GC连带连坐就会被拿掉,前面讲过了,就可以使S对象在方法执行完毕以后顺利的被回收,且ENT key的引用指向我们这个那。这么说能跟上,那杨哥还是有点模糊,一句话给你讲明白,回到我们这儿。一个叫自然人线程thad.java一个叫th local.java这是两个不同的类,OK,都有自己的独立性,啥意思呢?一个是人,一个是我们描述我们这个人的身份证卡片,你这个卡片是装到人钱包里面,对吧?人是人,卡片是卡片,那么现在我们正常而言,假设一个人啊,因为。
04:09
疾病或者各种原因正常的去世了,那么请问我们去公安部去注销这个人的户口的时候,是不是人死如灯灭,身份证也要被拿掉,一句话,你应该跟着这个县城里面的这个,换句话说说,如果人死了,这个身份证信息,这个卡号也应该作废,比如说帮改打个标签已去世,对吧?所以说如果你是强饮药。那么这个就候变成人没了,那么身份证这个信息还存在,这个是世界上,那么这样的话,我们的留下的东西是不是越来越多啊,所以说我们为了达成这样一致啊,就把它从钱也用不要使用用弱引用,你钱也要就会变成人没了,身份证的这个信息还存着,容易数据多了以后造成内存泄露,若引用的意思就是比较符合实现实的要求和规范,人没了身份证这块也给你拿掉,因为没有用了,对吧,所以说呢,我们呢,就希望呢,所有的local对象在方法执行完毕以后顺利被回收,那么ENT出的key的引用就指向回纳。
05:12
好,这就是为什么我们要用若引用说穿了,你用完了回收,咱们跟着一块走人,没了身份证的信息也请你注销,OK,好,那么这个呢,就是我们的是吗?第一个坑,至于说后面这个,我们下一节再给大家进行相关的介绍,那么这个时候呢,我们就会引出来,若引用是不是就万事大吉了呢?不一定。
我来说两句