00:01
好,同学们,哎,我是上午的老师宋洪康,那么咱们再讲完这个第四章啊,叫做哎,GM运行时参数之后啊,咱们再讲一个这个第五章叫做分析JC的日志。啊,那一提到这个分析JC日志啊,大家可能会不太陌生,因为呢,咱们在讲到这个上篇的时候呢,其实给大家呢,稍微的提了一下JC日志的一个分析啊,当然呢,也包括J些日的一个生成啊,就是我们涉及到第四章呢当中的一些内容,咱们在这个上篇当中啊,也讲解了一些啊首先的话呢,我们再看一下这个上篇我们提到这个内容啊,以及呢,我们为什么要讲这个GC日志的一个分析呢?我们上面呢,其实重心呢,是在这个内存片上,以及呢,我们这个垃圾回收片上,在讲到这个垃圾回收器的时候啊gab这collector是吧,提到这个垃圾回收器的时候呢,我们讲了讲,这叫诶日志的一个简单的分析。啊,简单一个分析,那我们现在呢,为什么还要讲这个日志的分析呢?准确的说呢,就是我们这个角度呢,就不太一样了,哎,不太一样,哎,咱们先说这儿啊,咱们现在为什么要再谈一下这个日志呢?是因为呢,咱们最终讲节,不管是这个上篇中篇,包括这个下篇,咱们把这已有的这几个章节讲到一起的,最终目的呢,其实都是为了奔着我们第六章和第七章去的。
01:15
就是我们常见的这个OM的场景都有哪些,我们该如何去解决内存层面的,垃圾回收层面的,以及呢,我们为了发现内存层面和垃圾回收层面的这样的一些问题,我们需要使用很多的参数,对吧?包括呢,一些代码层面的一些问题,我们可能还得需要基于这个字节码才能够去看得更清晰一些啊类的加热器等等,这个都是我们讲上篇中篇,包括下篇到目前为止的这个原因所在。啊,还有这个T7张就六七呢,是我们真正最后要推进的,对我们实际啊,在生产环境当中是非常有意义的,这种实战实际操作就是六七张,但是为了要掌握好六七张,真正的实现这个性能的一个调优和优化,那我们就需要呢,前面这样的一些知识。那这里呢,我们讲这个日志分析呢,是为了咱们要解决真实这个场景当中,我们看看这个,呃,日志里边给我们提供的这个信息,然后便于呢,我们去进行一个这个数据的一个分析,是吧,去这个调优了,而我们上篇这个在讲这个GC日志分析的原因是什么呢?哎,因为呢,你看我们刚才讲上一章的时候呢,用到了这个print j details是吧,通过这个日志文件的话呢,咱们其实也能够看得到,就是你到底使用的是哪一个垃圾回收器,对吧。
02:25
啊,因为呢,我们讲这个垃圾回收器上面的时候呢,这不也会配置不同的垃圾回收器嘛,我们通过这个日志文件呢,就也能够发现了啊,当然这个发现的话,也不一定说非得是通过这种方式,咱们呢,在讲这个第四章的时候啊,这个稍微再咱们再这个捋一捋啊,咱们讲这个第四章的时候呢,是不是说咱们用到了这个参数啊。那就就这是吧,叫print command line flex啊,使用这个命令行的这个,呃,虚拟机的这个参数的话呢,我们也能够看到你到底使用的是哪个垃圾回收器,使用这也行,或者呢,我们就直接在日志当中去查看。对吧,那举个例子啊,你看这里边呢,我写了一个JCU的这个test,这呢写了一个非常简单的一个程序,这个程序的话呢,咱们把它呢,做一个这个参数的一个配置啊,针对我们当前这个JCU它啊首先呢,我们配置一下这个堆空间的一个大小,比如就100兆吧。
03:15
啊,100兆好,然后呢,我们再来一个啊X冒号啊,然后加上print AC。Details,好这样的一个参数,对吧,加上这个参数以后呢,现在比如说我们想使用具体的某一个垃圾回收器了,嗯,比如说呢,咱们就使用这个串行的吧,哎,CTRLC一下好回过来。我们在讲这个上一章的时候也提到了,你写这个use zero GC,它也会把老年代呢,是不是使用这个O的这个GC对吧,来进行一个垃圾回收,那这时候我们做一个执行。嗯,出来这个数据了,那这个数据当中呢,我们就能够看到,你看这呢叫DeFine new是吧,这呢就表示我们使用的是这个zero j c。那就是我们通过这个呢,其实都能看得出来,这个呢是这个新生代的,这个呢是这个老年代的啊,只要看到这两个单词,你知道呢,使用的就是这个串行的垃圾回收器了,OK,那如果呢,我们使用比如说这个吧。
04:09
嗯,Use这个CMS是吧,那它这个CTRLCCMS的话呢,是老年代的,新生代的话呢,它会用这个panel啊进行这个回收。来操作一下,把这个呢,我们做一个替换是吧,好这时候我们再做一个执行。哎,出来了,那这时候的话,我们再去看这个panel呢,这不就是哎,我们说那个panel嘛,是吧,就是这个,哎,这个zero g c的一个这个一个并行操作对吧,那就它那那老年代的话呢,这不就CMS嘛,哎,所以说呢,我们通过这个日志文件呢,是可以看出来你到底使用的是什么垃圾回收器的,是这个角度呢,咱们是讲的这个上篇啊,那咱们现在这个重心的话呢,其实是为了我们真正要进行调优做准备的,OK啊,那这样呢,我们把这个内容呢先拉回来,呃,那么在这里边讲解的话呢,其实大家会发现呢,大部分内容跟咱们上面讲的其实差不多啊,因为也也也没什么特别的,主要就是大家去能看得懂这个日志日志文件就行,对吧,那当然了,我们还有一些工具啊,那就涉及到这个第三点啊,就是工具的一个使用啊,仅此而已,好,那我们这个算是一个复习吧,对吧?过来啊,这个JC日志的参数呢,咱们再讲上一章当中已经讲到了,所以我这呢就完全的就不说了啊,就过了。
05:20
然后呢,咱们来看一下这个第二个叫JC日志的一个格式啊,这个JC志的一个格式呢,呃,讲它之前咱们首先呢,先复习一下咱们讲的这个JC的一个分类。呃,这个JC呢,咱们老师说这个JC,这个JC呢,其实是有两个词,一个呢叫garbage collection啊,是那个ion是吧,Collection垃圾收集的意思,另外一个呢,叫garage collector啊,这个落脚点呢,是这个O2了是吧?哎,就是垃圾回收器简称呢都叫做GC,这个呢,具体场景你得看看我们说的是谁啊,在这呢,我们说这个JC这个分类,这个C是回收器啊,还是垃圾回收啊。哎,应该是垃圾回收对吧,哎,不是垃圾回收器了,要垃圾回收器呢,这里边是不是就该写那些不同的垃圾回收器了啊嗯,来我们看一下这个J些这个分类的话呢,注意这个呢,咱们咱们在讲这个上边的时候呢,其实也跟大家都提过,所以这呢是一个复习了,需要大家能够懂清楚,就是得有一个理论的一个认识,就虽然实际上呢,咱们在说的时候呢,可能是大家都混淆着去说,但是理论上是什么样的,你得清楚。
06:22
啊,这个JC的话呢,如果我们按照这个回收的区域的话呢,分成了两大类,第一类呢称为呢叫做部分收集,第二类呢称为呢叫整堆的一个收集。嗯,部分的收集和整堆的一个收集对吧?好,那我们先看这个所谓的叫部分收集,部分收集的话呢,就针对于我们这个堆空间的具体的部分了,比如说是针对于这个新生代的,或者叫年轻代的啊,针对于老年代的啊,这样的两个典型的这个区域。那针对这个新生代的话呢,我们就称为呢叫mini c,也称为呢,叫做young j c啊,这个说的都是它,或者有的时候我们也直接呢,就简写成叫YJC啊,这说的也是这个young j c的意思啊,说的是这个新生代啊,这个新生态这个垃圾回收器呢,它新生态这个垃圾回收呢,主要针对就是这个伊甸园区满的时候呢,我们就进行的垃圾回收,对吧,那咱们说呢,Java中这个对象呢,大部分的啊,都是这个朝生夕死的或朝生夕灭的对吧,所以呢,这个呃新生代这个young j c或者叫mini j c呢,它非常的频繁。
07:18
而且呢,回收的速度呢,其实也是非常的啊,那这呢是它的一个特点,那下一个呢,叫做老年袋的一个答圾回收。专门针对老年代的话呢,我们说呢,可以叫做major j c啊,也称为呢叫OLDJC啊,这都是说的这个老年代的意思是吧,还说的就是它就是当我们这个老年代这个空间要不足的时候呢,诶,我们触发的这样的一个垃圾回收的行为啊,这个大家要稍微注意一下。嗯,这是一个,然后另外一个呢,就是通常我们会说呀,呃,在实现这个老年代垃圾回收之前啊,一般呢,也都会进行一次,叫mini j c。啊,就是在他之前通常呢,也会执行一次这个mini,为啥呢?你看啊,这是伊甸园取,这呢是survivor领取,SURVIVOR1取啊这呢是咱们这个叫老年代是吧,这个我们老年代呢,你想它要进行这个major j c了,在回收之前,比如我们这有个对象,这个对象的话呢,呃,你要是往这放的话呢,这个有可能会导致这个major j c,那在这个之前,我们先看看你这个这个这个叫什么呀,一点元曲啊,你先进行一次样JC,样JC完以后呢,看看这个数据是不是就可以直接放你这了,要能放你这儿的话呢,是不是就不用再去执行这个叫major j c了,是吧?因为相对来说这个major j c它花费的这个时间呢,要更长一些。
08:31
啊,要更长一些啊好,这是说的这样一个点,然后的话呢,我们这里就看到这样一个词了。哎,这样词的话呢,就是major j c跟for j c啊,就是咱们平时说这个for j c的话呢,呃,如果从这个日志文件上来看,咱们其实就分成这两两种情况,对吧,一个呢叫mini,一个叫for,大家看这个咱们那会儿生成的这个文档不也很清楚吗?啊这个呢,啊这块呢,针对的不就是这个叫mini j c,这呢不就叫所谓的for j c是吧,那这个for j c啊这个呢,我们有的时候呢,说的时候就混淆着去说了什么意思呀。
09:05
嗯,如果呢,从理论上来讲,那for GC应该是整个堆的一个回收,那这个堆呢,就是我们说的年轻代老年袋,还有方法区是吧,合一起的这个叫for GC,当然有的时候呢,我们把老年代这个垃圾回收呢,就也称为呢叫for GC了。啊,所以这个呢,注意就是如果跟同事呢,去聊起来这个for c的时候呢,呃,你要理解他说的这个forc到底指的是整个的一个,呃。对空间是吧,年轻贷,老年贷加上方法区以后的这个回收行为,还是是专指的其中的针对老年贷的一个回收。啊,这个要稍微注意啊,稍微注意一下。呃,另外呢,提到叫mix这个J这个呢,只有咱们这个g first回收呢才有啊,这个咱们讲这个j first上的时候,提到它的回收的这个过程当中,咱们讲到这个混合收集了啊,在这呢,我就不过多的去强调这个事儿了啊。行,嗯,这呢,就是我们强调的这样的几个事儿啊,大家得清楚,嗯,这个针对于整堆的话呢。
10:02
等堆注意这个堆的话呢,还要明确一个事儿,这个呢也是算一个复习,这个堆到底指的是什么对吧?那我们能看到呢,这块它会显示我们报这些,你看这算叫年轻代啊,这是老年代,那后边是不是还有一个叫Meta space啊,那UIG呢,就是这个堆里边,它是把这个方法去呢,也可以涵盖在去涵盖在里边了,也就是说呢,咱们GM官方规范里边呢,新生代老年代和方法区,呃,原生空间啊,都算成是一个堆的部分了,只不过呢,我们实操的时候呢,实际。呃,这个这个呃,设置说对空间的大小,咱们其实只设置的它俩的一个和是吧?啊就像我们刚才这里边儿设置的。哎,这个数据一样。那这个数据呢,咱们其实是只有新生代和老年代,不包括那个原空间的,那就是这真正落地的时候呢,来堆的一个实际的包含的内容啊,这个大家稍微注意一下,呃,然后的话呢,我们再回忆一下这个for j c啊,这个如果面试的时候问到你了,这个你看你能不能答出来,就是我们哪些情况。
11:00
啊,这里我写一下啊,哪些情况会触发。这个放进呢。哎,这个大家清楚吧。我们在讲这个上篇的时候呢,其实也都提到过这样的一些这个事情啊,回忆一下。哪些情况会触发疱这些,那首先的话呢,你这个老年代啊,空间不足了。到年代啊,空间不足对吧,那自然而然的触发的不就叫做forc啊,或者你也说呢,就是叫major的这个引擎是吧,那触发这个forc了,那新生代的话呢,空间不足不行,新生代的话空间不足是不是叫mini这些了,哎,这是它啊,那另外一个呢,就是这个我们说呢,一方面是包括这个对空间里边老年带还有呢,是不是我们说的这个方法区是吧。那方法区呢,空间不足,比如说呢,我们持续性的去加载一些这个类。啊,动态的加载类,大量的类呢,到我们这个方法区里边了,圆空间当中导导致我们整个这个方法区的空间不足啊,这个也会出现啊。那还有什么情况呢?比如说我们去显示的去调用。
12:03
哎,调用这个叫ACM,点这个JC这个方法是吧,哎,这个呢,也会出现我们对for GC的一个调用,嗯,还有什么呢,真的就是一些我们从统一上来看啊,哎,就是我们使用这个叫a minor j c。使用这个MJC呢,我们发现呢,它进入老年代的这个,呃,平均的大小。啊,这个进入老年代这个数据的平均。哎,大小。呃,这个大小呢,发现呢,它大于,诶我们目前老年代的可用内存。啊,那这个时候的话呢,诶,我们就也会去触发这个叫for GC啊,因为从统计上来看的话呢,我们这个,呃,现在进入老年代平均率大小已经比你这块可用的空间要大了,诶我们就要触发这个叫forc大啊,那这里一个情况还有什么情况呢?就是我们这个年轻代当中啊,这个有大对象啊,这个大对象的话呢,是不是直接要进入老年代了,那直接进入老年代的话呢,发现这个老年代这个空间呢,还不够是吧?哎,这个时候呢,也会触发这个叫for c啊,这个我们也写一下啊。
13:08
就是这个,嗯,大对象。啊,直接进入老年代啊,而。哎,老年代的这个空间可用空间不足。哎,这时候呢,就会触发我们这个也是叫forc行这几个事儿呢,咱们在前面呢也都提过啊,这块呢,再熟悉一下啊好,那这样的话呢,咱们就先把这个呃,Mid j c mid啊这个这个for j c这几个词呢先捋清楚啊,然后的话呢,我们下边来看一下这个日志的具体分类。
我来说两句