00:00
呃,那么关于这个垃圾回收器啊,咱们就先告一段落,然后接下来啊,咱们给大家讲一下,这叫GC的一个日志分析啊,那么咱们在前边呢,讲这个堆空间的时候呢,实际上也带着大家呢看过这个日志,对吧?看过这个GC的日志,当时呢,咱们也使用过相关这个参数,只不过这里的话呢,咱们做一个统一的一个总结啊是这样一个场景,那么先回忆一下我们之前的一个场景,比如说呢,我们打开这样一个程序,这呢是一个list,然后呢,我这是遍历了500次,诶,造了一个这个字节的数组,这呢是100KB,然后呢,把它添加到我们这个list当中,OK,这个呢,我就先没有这个sleep啊,让它运行完呢就直直接呢就结束,针对这个程序的话呢,我们在这块可以,诶先看我当前使用的这个是JDK1.8对吧,在JK8的这个场景下呢,我们现在去设置这个参数,当时的话呢,咱们是不是主要呢,用的是这样个参数啊,诶叫print j c。嗯,Details是吧,来设置这两个参数,然后呢,我们做一个OK,那么加上这个参数以后呢,我们做个执行,看一下它这个内存的一个使用情况。啊,这块说我们得用的这个版本不太对,诶刚才没注意啊,咱这显示的是1.6是吧,把这个改成是1.8啊。
01:07
嗯,跑一下。1.8我们跑的这个程序呢,看看是不是对啊,这块跑的是我们这个g c log test没问题是吧?啊这块这个这这有没了,刚才那个参数我们是不是记到这个位置上了,诶把咱俩CTRLC一下啊粘到咱们这。行,然后这块我们点OK跑一下。出来了,那这样呢,能显示出来我们当前这个堆的一个使用情况,正常来讲的话呢,它还会去显示我们这个垃圾回收的一些情况,只不过呢,当前呢,我们没有这个垃圾回收行为,那为了能够让我们当前这个程序呢,能够呈现出来这个垃圾回收行为呢,这块我们去设置这个堆空间的一个初始大小和一个最大的一个大小。对吧,哎,我这里就写到前面了,这个参数比较简单啊,所以这块呢,我们就不用多说了,然后点型OK,然后再做一个执行。行,那这时候我们再去看一下我们这个打印出来信息,上面的话呢,就是我们这个垃圾回收的一些相关行为,下边呢,就是我们垃圾回收结束之后呢,这个堆空间的一个占用情况,这个咱们前面呢,讲这个堆空间的时候呢,是不是也执行过好几次是吧?那咱们现在呢,为什么又来讲这个事儿呢?因为现在呢,我们讲完这个垃圾回收器之后啊,大家再来看这里边相关的一些描述,我们会更加的清晰,比如呢,这里边这个PS young啊,Generation这个这个镇是吧?Young镇啊,Generation是吧,然后还有这个叫part拍old啊,这这是什么意思啊,实际上这块指明的就是我们使用这个垃圾回收器。
02:33
啊是这样的一个原因就是我们使用的垃圾回收器不一样呢,我们这块呈现出来这个信息啊,也会有所不同,这个大家注意一下,你比如说的话呢,咱们要切换成这个JDK9的话呢,这个打印出来这个效果呢,它又会不一样。那比如这块我们换成是这个九啊,OK一下,然后在我们这个位置。咱们这呢,也换成是这个JDK1.9,然后点一下OK,然后我们此时呢,再去执行当前这个程序。可以了是吧,当然呢,这时候你会发现呢,诶这个信息好像很复杂,这个信息呢,是因为我们现在用的是不是叫诶garbage first这个hi,就是我们用的这个G1是吧,这个垃圾回收器呢,变了,所以我们这个打印的信息呢,它会有所区别啊是这样子的,那那咱们首先呢,给大家来介绍一下,这里边可以呈现出来,也就说在我们这个实际开发当中,大家呢,可以去查看的一些这个垃圾回收的行为,使用到的这些参数啊,在面试的时候呢,大家也可以呢,去提到这样的一些参数啊,这些参数的话呢,从这个简单到复杂,分别对应的叫print j c,或者呢大家也可以用,咱们之前呢,也提到过叫我boths j c,这俩呢基本上是一样子的啊,这俩是一样子的,下面呢叫print j c details,就是我们比较常用的是它,然后再下边呢,有一个叫time steps,这个呢会输出这个JC的一个时间戳,然后再往下有一个date,就涉及到输出这个对应的日期是这个time啊都有,然后还可以呢去print这个keep at j c,在这个JC前后呢,打印出这个对应的一个信息,那同时呢,我们还可以呢,把咱们打印出来这个信息啊。
03:58
啊,就这个信息给他放到一个对应的这个日志文件当中,咱们还可以使用这个日志分析工具呢,去导入这个日志文件啊,来进行一个可视化图面,呃,可视化的这个图像上的一个查看。
04:11
啊是这样的一个场景,行,这呢就是我们说的这些参数,然后下边呢,我在这个PPT里边呢,就是针对于咱们每一个参数呢,我都写了一个相关的一个例子,包括这个呃日志这个信息当中的一些咱们不熟悉的这个性质,这个这个参数啊这块呢,我都写了一个解析啊,应该说这个PPT呢,我这块解写的还是比较详细的啊,比较详细的,那么咱们光讲这个第17章啊这块我这PPT呢,就做了这个135页是吧?诶大家会看到这PPT呢,其实也不少哈,啊应该说呢,这个讲这个呃,GVM这个课啊,确实是花了一些这个时间哈,啊确实还是花了一些这个时间的,呃,但是呢,也确实看到了,就是现在呢,网上关于这个GM相关的一些资料啊,嗯,你要说少吧,其实也不少,但是呢,应该说叫鱼龙混杂啊,嗯,一方面呢,由于我们这个GM这个规范啊。
05:00
呃,GM这个规范的话呢,它这个版本呢,不断的在更新,所以导致的话呢,就是你看到一些资料呢,有可能是旧的版本的,那后边又有新的版本,那旧的版本跟新的版本有一些调整,甚至说它都有一些矛盾,对吧?比如我们像提到这个,呃,String呢,常量池到底应该放在哪呢?那有的书上写的是这有有的,那这个帖子上写的这那这是因为它这个版本不同造成的,对吧?另外呢,确实也存在一些这个呃书当中或者帖子当中,乃至于说呢,一些视频当中呢,这个描述呢,是错误的场景,这个我也见了很多啊,包括呢,我自己呢,在这个想呃深挖一下这个GM,包括呢,呃为了背这个课,也看了大量的这个东西,基本上大家在这个京东上,你看到那个书呢,我全都买过了啊,我全都买过了啊,包括那个帖子呢,我也是看了非常多,然后呢,整理这个课程的话呢,花的时间呢,也相对来说长一些啊,我知道呢,大家等这条视频呢,等的时间也很辛苦啊,我记得之前有一个。呃,咱们看这条视频的一个粉丝呢,也说说这个从冬天呢一直等到夏天,现在已经是五月份了是吧?这个前一部分呢,发布的时候呢,还是去年的,呃也也是今年发的哈,只不过那时候比较冷而已,呃就是年前发的啊,年前发的,那现在呢确实等了一些时间,当然这个呢,呃在中间呢,我也是,呃线上呢讲了一段时间的课啊,因为咱们现在都改成线上了,呃讲了一段时间课,然后之后呢,就一直在被这个。
06:20
呃,GM这个课程那里边的东西细节确实很多啊,要想讲好这个课程呢,还是确实要准备很多这个东西啊,我希望呢,这个讲的东西呢,确实能够帮到大家啊,能够从一个呃,比如说基本上学完Java语言这样的一个同学呢,就能够看得懂啊,市面上呢,至至少目前为止还没有任何的一套视频呢,是比较详细的来讲解这个GM上来呢,通常都是假设呢,你已经有这个GM的呃,非常不错的底子了,上来呢就说一些所谓的高大上的东西,但其实呢,我觉得都不是特别的接地气。啊,不是很接地气啊,嗯,行啊,不管怎么样呢,只要是这条视频呢,能够帮到大家,我觉得这个花这样几个月的时间呢,也是非常有意义的啊好,那么咱们还回过来说这个事情,这呢用的是这个我boss啊,然后你用我boss j c也好,用这个print j c也好都可以,那比如说我们这块呢,就演示一下前面这个参数,那么针对于我们这块呢,咱们也可以先展示一下,我呢还是先给它调成是JDK8。
07:19
哎,咱们现在这个八的场景当中去说,目前呢,毕竟这个在实际开发环境当中啊,我们这个默认的场景还是JD8这样一个场景,诶我们把上面这个参数呢,就直接改成叫print GC对吧,OK一下此时的话呢,我们再去打印,你会发现呢,这个信息呢,就相对来说少一些。啊,少一些是不是这块呢,只列举出来了,我们关于这个垃圾回收这样一个行为,对吧,而且呢,这块你看的也比较短啊,垃圾回收的行为,然后没有列举出来我们这个,呃,对空间的一个使用情况,所以它这个信息量呢,就比较少一些,在这个过程当中,我们看到它都有哪些参数呢,我在这个PPT里边也写了。前面这个JC跟那个for这些呢,它指出来就是我们这个垃圾回收的这个类型是什么?这块是针对我们这个算是新代的一个回收是吧?这块呢,是新生代老年代都有这个回收了,那它呢也会触发我们这个叫stop the world,那上边这块呢,叫alloc failure,它呢指明了叫分配的一个失败,对吧?什么叫分配的失败呢?就是这个呢,就指明了我们这个发生这个GC的一个原因是什么。
08:18
啊是由于我们这个,咱们知道这个样JC它要发生的话呢,主要原因是因为我们这个伊甸园区呢,是不是空间不足了呀,也就是说当我们希望在这个伊甸园这区再去分配这个新对象的时候呢,发现空间不足导致呢,分配失败了,分配失败呢,我们就要触发这个GC,哎就这样一个道理啊,那后边这块呢,是对应的这个参数呢,是我们这个堆空间在这个呃,JC之前啊和这个JC之后啊,它的堆之前一个占用情况,这是之后的一个占用情况,这呢是我们这个这块,是我们这个堆空间本身它的一个大小。啊,那对于我们这块来讲的话呢,咱们这儿因为你看这块我是不是也设置了一下我们这个,哎对应的这个对空间的一个值是吧?哎是60,那60的话呢,这块就指明了我们这个,诶堆空间之前你这个占用情况是这么多,之后占用情况这么多,这呢就是你总共的一个占用比例,这个大家可以除一下啊,基本上就是我们这个60兆啊这样的场景,后边呢,就是我们这个这些呢,所花费的这个时间。
09:16
啊行,这就过了,然后接下来的话呢,就是print j c details啊这个呢,对于大家来说呢,应该是比较熟悉的了,就是刚才我们演示的其实就是它对吧,当然呢,可以在我们现有这个参数的基础之上呢,你后边再给他补一个,或者你把这个给它删掉呢,其实也行啊。那details,那就是加上它也没关系,那当然你有一个更详细的一个参数的时候呢,我们就以这个后边更详细的一个参数呢为准啊,那我们这块呢,来一个OK跑一下。行,这就出来了,这个时候的话呢,我们看到上面这个垃圾回收的这个时候呢,它记录的也更加的详细了,那其中这个叫样阵是吧,这个的话呢,就针对我们在GP1.8中,咱们使用的是不是叫嗯,Parallel gain是吧?啊这个并行的垃圾回收器,然后呢,这个在for GC的时候,涉及到这个新生代和这个老年代的一些行为,这个老年代这块呢叫啊拍old,实际上呢,就是parallel old的,呃,这个垃圾回收器,所以通过这呢,我们就能够很清楚的看清楚这个参数的一个意思了,啊就是这样个场景,这呢我也举了,诶举了一个这样的一个例子,对吧。
10:17
哎,在这里边呢,它指的就是我们这个parallelcaven,诶这呢就是parallel old啊回收这个老年代的,然后针对我们这个1.8的时候呢,咱们这块显示的叫Meta space,那形式上的话呢,我们说逻辑上把这个方法去啊,咱们看成是这个堆空间的一部分,那事实上呢,它是不是还有个名字叫做非堆,咱们当时呢,是不是说过这个词啊。那在JDK1.8的时候呢,方法区的落地实现呢,我们叫做圆空间,那如果你要放在JDK1.7的环境中,这块呢,显示叫哎这个prom是吧,哎稍微的说一下,比如我们这块改成是JDK1.7。然后我们在这块呢,也做一个调整。OK一下,好,把刚才那个程序呢,我们再重新的执行一下。
11:00
哎,这时候大家就看到我们这个呢是叫PM,那这呢指的就是我们叫永久带啊,咱们前面呢,是不是讲过这个问题啊是吧?OK啊这个事呢,一说大家应该都非常的清晰啊,那自己呢下来呢,大家也自己呢去操作一下啊,自己呢也去稍微的操作一下啊,我们再改成是这个八的环境。那现在就叫做Meta space OK,行,这个事呢就不用多说了,嗯,然后呢,如果说我们再加上一个参数,这个参数呢,就是我把这两个就都一下子都加上了啊叫jc time steps和JC这个data steps啊CTRL,诶或者我这块呢,可以先一个一个加啊CTRL一下我在PPT里边呢,就一块加上了,在这块呢,如果我们先加上一下这个叫哎,Time steps。啊,先加上它,我们先做一个执行,大家看一下这个效果。好出来了,那这时候这个区别的话,你会发现呢,在我们这个GC之前啊,是不是多了一个这样的一个参数啊,这个参数是什么意思啊,这个其实是个时间,这个时间呢,我们可以理解成呢,就是我们这个虚拟启动的时候呢,呃,启动以来它这个读的这个秒数啊,读的这个秒数,你看这个时间还是非常短的,对吧?这这个秒数,然后在这个基础之上呢,我们可以再把后边这个参数呢,给它加上哎,CTRLCL一下。
12:16
嗯,在后边越来越长,这呢,有一个这个日期和时间了,哎,我们再来做一个执行。行,这时候大家会发现呢,是不是前面就更长了,在年月日啊,这后边呢,是我们这个时间啊,这个现在已经这个晚上十点多了啊,为了录这个视频呢,这个现在也是,呃,晚上呢,加班加点的在录啊,就是现在呢,我还是在咱们商务的这个北京校区里边,呃,整个这个楼层呢,现在就只有我这一个教室就只有我在哈,呃,希望呢,能够尽快的也是把这条视频呢,能够给大家推出出来。啊,这样的行,现在是晚上这个十点多,呃,我们现在是在这个东八区是吧?诶这就我们显示的这个信息,所以通过刚才这样一个演示呢,大家应该能够清楚的能够清楚的能够看到哈,就是我们呢,在这个打印这个日志的时候呢,我们使用这样一些参数,这个呢,我就不演示了啊,这些前后的一个堆列信息,然后最后呢,还有一个这个log文件,这个文件呢,咱们一会呢来讲,诶稍微呢一会给大家讲一下这个日志分析的一个工具,诶我们到时候呢,再把这个j c log呢给它导出去。
13:16
行,那首先的话呢,通过刚才这两个演示呢,大家先熟悉一下我们这里边儿这个参数啊,自己呢,也可以稍微的演示啊,看一下我们这个参数呢,是不是能够正常的去显示出来,好。
我来说两句