00:00
行,那垃圾回收相关的概述呢,结束以后呢,咱们下边来看第15章,第15章呢,我们叫垃圾回收的相关算法啊,这个一提到算法呢,就大家可能会觉得说这一张呢,会不会比较难,那实际上的话呢,这一章啊不算是特别难,那为什么这么讲呢?因为呢,咱们不涉及到说这些算法呢,需要咱们自己手动的用这个代码呢去实现,对吧?我们呢,也仅仅呢,会涉及到相关的收集算法的一些,比如说原理是什么,它的背景是什么。然后具体这个应用场景又是哪些对吧?哎,应该我们主要关注的其实就这些,就咱们没有必要呢,去底层呢,把这个算法呢去实现啊首先来说呢,这个实现方式呢,它还是比较复杂的。对吧,就是里边有很多的细节呢,需要我们来考虑的啊,这是这个原因,那另外的话呢,就是本身呢,咱们这个大家呢,即使这个你针对于open jdk啊,在一些大厂当中呢,我们需要呃基于open jdk呢,然后我们把这个GM呢,做一个呃具体的一些调整优化的时候呢,关于算法这块,就是垃圾回收相关算法这块呢,我们变化呢,通常也不会特别大,所以说呢,我们就呃不再去深入的给大家去看一行一行的代码,哎,去怎么实现了。
01:05
所以从这个角度来讲的话呢,我们这一章呢,其实难度呢并不大啊,那另外一个角度呢,就是说关于这个垃圾回收相关算法,在面试当中问到的频率呢,是非常高的。啊,那当然呢,常问的这个问题呢,咱们这一章呢,当中一定会给大家全部都涉及到啊,也就是呢,从面试的角度来讲,这一章呢,还是比较重要的,那同时呢,咱们也能够给大家讲透啊,就这样的一个情况,那首先的话呢,咱们来看一下这一章呢,咱主要讲解的一些章节啊,都有什么啊,都有哪些具体的细节,那一提到我们说垃圾回收算法啊,首先呢,我们需要明确一个问题啊,就是我们要进行JC对吧,咱们接下来这几章呢,不都是说的是这个JC的问题嘛,这个JC呢,其实可以翻成翻译成两个词,一个呢叫garbage,就垃圾回收器,一个呢叫garbage collect啊,垃圾回收这样一个行为啊,是一个都是名词啊,那我们一提到这个GC的话呢,我们要进行垃圾回收,那你首先得确定哪些结构是吧,这个结构呢,主要咱们指的就是对象了啊说哪些这个对象呢是垃圾,那我们需要呢,把它们清理掉。
02:08
就是简单来说呢,这就是我们JC的这样的一个过程,那哪些对象是大机,我们把它清理掉,实际上呢,你看我在说这句话的时候呢,大家会不会发现呢,实际上我就分成了两层含义啊。说哪些是垃圾,然后我们呢,把它回收掉,那就涉及到哪些是垃圾啊,一个问号回收怎么回收啊,是不是又是个问号,所以呢,自然而然的呢,咱们就把这个JC的过程啊,分成了两个阶段,那么一个阶段呢,就称为叫标记阶段。就称为叫标记语算,就我们需要识别哪些结构,或者说叫对象呢,我们不再使用了,咱们需要把它呢标记出来,涉及到相关的这个算法呢,叫引用技术算法和可达性分析算法,或者呢,也称为叫根搜索算法啊都行,那另外一个角度呢,就是我们确定了这些对象式垃圾以后,我们该怎么去清除啊,这就涉及到这个清除阶段。这属于一个递进关系是吧,先标记后清除,就跟说你做饭一样,你得先是不是把这些菜呢,先买回来,先洗了,这就相当于第一个过程,第二过程就是你炒,炒的这个过程对吧?啊,你像我的话呢,我就不太擅长去炒,这这我做不好,没有我媳妇做的好,那怎么办呀,那我只负责第一个阶段,我负责去买菜,我负责把菜洗干净是吧,然后我媳妇呢,她来炒。
03:20
最后呢,最最高级的阶段交给他来做是吧?诶然后吃完饭以后呢,然后洗的这个工作呢,还可以我来做,就我做的就稍微比比较低档一些这个工作是吧?诶那至少我们也能看到是分成几个阶段的啊,那么在这个清除阶段的话呢,我们会涉及到呢,有这样几个算法,一个呢叫标记清除算法,还有呢叫复制算法,还有呢叫标记压缩算法,主要呢,我们谈就是这三个算法。包括呢,对这三个算法呢,我们做一个小结对比对吧?诶OK,是这样子的,那有些时候呢,大家会看到在网上一些帖子或者一些书当中,这个上来呢,说说请你分析一下这个可达性分析算法和这个标记清除算法啊,以及呢,后边这四个,呃,这个对比一下。
04:00
那这个大家注意啊,这种问法实际上是有问题的。大家能理解这个点吗?哎,这个问法实际上是有问题的,为什么这么说呢?就是我们把这个可达性分析算法,或者说呢,叫跟搜索算法是吧,跟我们这个标记清楚算法混到一起,其实是不太合适的。因为本身呢,他们是不是就不是同样一个阶段呀。对吧,你要说这个标记阶段的话呢,我们这俩算法你做一个比较是吧,你这个轻度阶段呢,你几个算法做个比较,这都是合理的,这个可达性分析算法跟我们这个标记清楚算法,它俩是没有可比性的。啊,因为它本身就是不同的阶段啊,就跟说有一个面试问题啊,像咱们大家学这个障碍语言的话呢,肯定都学过这个异常处理,对吧?那么异常处理的时候呢,那其中呢,就涉及到我们如何去处理的话呢,涉及到一个叫lo,抛出一个异常类型,在方法的生明处,另外一个呢,就是我们用的这个叫TRY,是不是catch finally对吧?这呢是我们说垃圾这个,哎不是垃圾这个异常呢处理的两种行为,那垃圾处理的前提是什么?是不是,诶不是垃圾这个异常处理的前提是你已经有异常了,那么关于这个异常是如何出现的,我们说一种呢,叫做自动出现。
05:09
像我们说的控制帧啊,角B越界呀,是吧?哎,Class class exception啊等等这些呢,都是当我们程序你执行有问题的时候呢,它自动的会创建一个对应的异常类的对象。这都属于自动的行为,那我们是不是也可以在程序当中手动的,是不是给他去,诶抛出一个异常类的对象啊,哎,这呢就涉及到另外一个关键字叫做死肉是吧?哎这样一个行为,那其实呢,这就是两个递进的一个阶段,上边这个有点像标易阶段,下边这个有点像清种阶段,那如果说出个名题,说你说明一下这个死肉跟死肉死它俩有什么区别。实际上啊,就首先说这这还真是一道面试题是吧?啊,实际上这道面试题呢,很无聊。大家能明白吧,为什么说无聊呢?是因为他俩呢,根本就没有什么可比性。对吧,你一个呢是生成异常对象的过程,一个呢是处理异常对象的过程,这不是一个事儿,就跟说你说哎,这是一个男人,这是一个女人,你说这两个这两类人他有什么区别呢?那你可以去对比对比,因为前提大家都是人嘛,你说这是一个男人,这是一个这个这个小公狗是吧,你说这个这个男人跟这个小公狗他们有什么区别呢。
06:15
没啥意思嘛,根本就不是一个类型是吧,我们这儿呢,根本就不是一个阶段,那你比啥呢?啊,那这块笔呢,是因为诶为什么这道面试题还挺挺常见的,是因为这个肉跟Rose啊,就加了个S,诶很多人还确实就因为加了个S就懵了,诶所以面试的时候呢,就是故意混淆,你实际上呢,这个面试题挺无聊的是吧?那其实张化中这个面试题呢,无聊的还挺多的,像这个让你去分析一下这个final是吧?哎,Finally final有什么区别,你说这个题是不是也很无聊,没有什么区别啊,不是没没有什么相关性啊。啊,这是关键字,这呢也是关键字是吧?用的场景呢,没有任何的这个这重叠的地方啊,那finalize是一个方法名啊,就是因为长得比较像所以才考啊,其实挺无聊的对吧?那这里边呢,关于可达性分析跟标记清楚这两个呢,其实你说让比较它俩的区别,其实也挺无聊的啊,要我的话呢,我就说一句话,这呢是标记阶段的,这个呢,是清楚阶段的,两个呢,就是没有什么相关性,对吧?得先标记然后才能清楚啊,哎,就这么着。
07:14
行,那么除了呢,我们这一章呢,要给大家讲解这个标记阶段和庆祝阶段对应的这几个算法之外呢,咱们另外要说的就是这我写的哈叫对象的finalization机制。诶,刚才呢,提到了一个叫finalize方法,诶这个方法的话呢,大家多少应该都听过啊,或者呢,也有可能有些同学呢,自己还重写过,就是呢,在我们这个object类当中啊,有一个方法叫做final,那这个方法哎涉及到了就是我们这个对象呢,在被回收的时候呢,诶这个方法呢,会被调用,这呢我们提一下啊,相当于给大家做一个拓展对象的finalization机制,那另外的话呢,就是在我们的这个可达性分析分析这种算法当中啊,咱们呢,会涉及到啊一个非常重要的概念叫做j c roots。哎,叫做jc roots,那这呢,也是咱们Java当中真正使用的这样的一个标记的算法,那我们这块呢,给大家讲解一下这个jc roots啊,咱们使用这个叫MAT和啊这profile这样两个工具呢,如何呢,去这个查看啊,相应的这个g c root。
08:10
这呢就给大家简单说一下啊,那么后边呢,咱们到这个呃,监控和调优阶段的时候呢,关于这个MAT和这pro呢,咱们到具体的给大家详细的讲解。这呢,我们还是这个比较功利的是吧,就是呃,需要用什么,咱们呢就讲什么,哎这样子OK,那么除此之外呢,后边咱们还涉及到呢,诶你看我这还写了其他的算法啊,前面呢,我没有标识,实际上呢,这个九跟这个十,这个罗马数字十这两个涉及到的其实还是我们这个清楚阶段的这个算法。哎,注意还是清楚阶段算法啊,这个呃分代收集算法,这呢实际上是针对我们具体落地的垃圾回收器来讲,真正用的呢是叫分代收集算法,但是它跟上面几个算法什么关系啊,咱们会讲再一个呢,就是呃应应对于这个新的这个场景,我们说呢,哎,需要对这个算法呢再进行一些迭代更新,这呢又引入了叫增量收集算法和分区算法。
09:02
啊,分析算法呢,就针针对于我们像g first这样的JC是吧,垃圾回收器实施的这样的一种算法,那到后边咱们再给大家讲解一下这相关的几个算法,所以这样的重心呢,就是我们讲解垃圾回收的相关算法。OK。
我来说两句