00:00
好,同学们,接下来我们呢,拉开架驶开工,已经新建好了一个带final方法的对象my object,待会儿我们会说,就是在这个Java虚拟机回收之前啊,死之前你要留个遗言会调用这个方法。好,那接下来前软若虚理论实操,理论实操我们一个一个过,先把它整明白了,才能回答为什么人家用的是weak reference弱引用,好那么下面我们来先复习回顾一下什么叫强引用。内存不足的时候,Java虚拟机就会垃圾回收,对吧?但是呢,对于强引用对象,那么也就是就算出现了OM,它也不会对该对象进行回收,死都不收,只要是强引用,说明还在用呢,我不能收。说穿了,我们最常见的引用就是强引用,最常见的普通对象引用,也就是我们所说的强引用啊,我们一般不做特别说明,就是指六出来这个对象,比方说student s1等于new student这样的话就是强引用,那么只要还有强引用的指向一个对象。
01:05
STUDENT1指向这个new student就说明这个对象还活着呢。收集不会配不会碰撞对象,把一个对象赋给一个引用变量,这个引用变量就是一个强引用,OK,那么当一个对象被强引用这个变量引用的时候,指针指向它的时候,它处于什么可达状态?我们是不是说过GC root跟可达算法?OK,你稍微有点Java虚拟机的基础知识应该懂我在说什么,我这就不再展开了。只要是可达,说明有人用着它不可以被回收,所以即使该对象以后永远都不会被用到,只要强用还指针指着它的Java虚拟机不回收,你不回收,这样的对象多了,就是造成Java内存泄露的主要原因。那么对于一个普通的对象,如果没有其他的引用关系,只要超过了引用的作用域,或者显示的将强引用复制为,那那么一般就可以认为到后续的Java虚拟机,那就把没有指针指向它的这个对象给收了,OK,当然具体细节咱们呢,可以看垃圾回收策略,当这块我们都说有一般默认的好,那么下面同学们,我们理论说完了,回到代码。
02:13
那么下面我们念my object得到这么一个对吧?这呢就是我们溜出来一个对象,这个就是我们日常用过的强以药,那么来。GC比负在垃圾回收之前来,同学们我们都晓得啊,我们先跑一下。相当于说这个就在26号之前说明什么都有一个引用my object指向一个实际对象my object,人家呢,尾号是9991是有编制的,对吧,所以说我们可以知道这个就是一个,那接下来怎么让它被回收呢?最经典的来吧。那么这。说明什么?我这个引用不再指向这个实例对象了,那么这个实例对象现在没有被用了,它会被回收,那么此时我们为了给大家讲清楚GC,那么这个时候干嘛,相当于是一个。
03:08
人工开启GC啊,一般不用,我们这儿只是为了演示,说穿了这也就相当于说后台主动触发这个GC垃圾回收机制,我们大家都清楚,GC有两种,一种叫人工自动。第二种呢,叫自动挡对吧,那么我这儿呢,就相当于是人为的主动触发,那么一触发就会去扫描,诶这个是为难了把这个对象给干掉,那么所以说我们在这儿。这呢是after,我做这的时候强也用,主要是给他是证明,当我们一个对象啊,在对象被不可撤销的丢弃之前,就是肯定是要死了,OK,那么它就会执行一个清理操作,会触发这个方法,那么看看后面会不会打出这句话呢来同学们。走一圈可以看到我们后台运行的效果。在GC之前确实有这个对象GC之后,那么大家请看这个呢,就是烂了,有没有打印出这个打印出来了,当然啊,他们谁先谁后,这个呢是看后台,你要是觉得不舒服的啊,这个呢谁先谁后倒不重要,那假设我这停500。
04:13
毫秒。跑一下。来同学们,因为它打印啊,这个GC它也是个后台线程,它不代表是我一触发它就马上执行,一执行就会马上打出这句话,它不一定啊,那么他们两个谁前谁后这个不重要,只要是告诉你我这儿。GC会把这个对象给收掉,这个对象一旦被收掉了,那么来按照我们官网不可撤销的丢弃之前会执行清理操作,来同学们请看,后台就会打出这句话,OK,那么这个呢,就是我们的第一组,也就是我们最重要的。一个开端,那么四大引用之一,那么也就是我们的什么强引用,那么在这块,那么请同学们呢,务必掌握,OK。
我来说两句