00:00
那下边呢,咱们具体的把这个焦点呢,集中在我们这个叫option这块行,那咱们就直接来看一下这个option这个参数的问题,Option呢这块呢一共是分成了有三大类啊,第一类呢是关于这个类装载相关的,就是我们刚才呢讲的这个杠class,然后第二步呢,是叫垃圾回收相关的一些参数啊,这块呢就比较多一些啊,或者说重心呢,其实就在这儿啊,对我们这个内存的这个垃圾回收进行监控的啊,然后第三类呢,就是叫GI it相关的啊,Comp啊printer comp,这个呢就是显示GI编译器编译过的方法,耗时等信息,这个呢是已经被git编译的一些方法,OK,这两个信息。好,那下边呢,咱们重点呢就来说一下这个叫option,因为呢这个接这块比较简呢,咱们就先把它这块呢清一下是吧,诶把这俩先说了啊行,那还打开咱们刚才这样的一个情况,这个程序啊,那GPS看一眼,其实这块不看也没关系,因为咱们刚才呢这个程序也没停啊,所以这个进程上也没结束,还是9000好JS date。
01:01
啊,那首先的话呢,我们叫杠comp是吧,先把它写上,别写错了,这个呢针对的是这个叫9000的这样的一个进程,好了,那我们现在点一下这个回车。那这里呢,大家就会看到我们编译过的一共是91个这样的一个结构是吧,然后花费的这个时间是这么多啊,编译这个失败的情况,编译失败的一个方法啊,这块呢,都给我们做了一个罗列啊,所以它这块主要显示的就是这个编译过的这个方法啊,还有它的这个耗时是吧,这样的一个情况啊,然后再接着呢,是叫。Print是吧?都是小写的啊。是啊,这样写,然后呢,还有回车。这里边呢,能够打印的就是我们这个被J体编译的这个方法啊,这个方法里边呢,就涉及到我们这叫end的这个方法啊,它被编译过了,哎,是这样的一个情况啊,好,这呢是我们两呃说的这两个这个参数对应的就是我们说这个嗯,JS state的呢,它的主要功能就涉及到JT编译这块的一个显示情况,行这个就结束了,然后下边呢,咱们这个重头器就在咱们这个垃圾回收啊相关的,那这里边呢,我们看到跟垃圾回收相关的呢,有好多的参数,简单的咱们先介绍一下啊,首先呢是这个叫杠JC,它显示的是与这个JC相关的一些这个内存的堆的信息,比如像伊甸园区survivor区这个老年贷永久贷啊,JDK7呢叫永带这个JDK8以后呢叫云空间对吧,涉及到容量啊,移用空间啊,JC的时间啊等等,还有jc capacity啊,跟我们这个杠JC呢,大体上是相同的。
02:38
啊,当然呢,这块更关注的是各个区域的这个最大最小空间啊,GC优秀啊,跟这个杠GC也是大体相同,当然这块呢,更多的涉及到是一个百分比啊,还有杠j c course啊,就导致我们发生JC的原因是什么?就是它的重心是在这儿,还有杠j c new,一看new就是新生代呗,啊杠j c new capacity啊跟我们这杠new呢类似啊,它主要关注的是这个空间的问题了哈,这是老年代的,这是老年代关注的空间的问题,这呢是关注于这个叫拥有贷。
03:07
啊,这是我们说的这个参数的这个情况啊好,那这呢,就我们简单的先介绍了一下,下边呢,咱们就这个给大家呢,来稍微的演示演示啊,看一下我们这里边儿这个情况。好,那还是打开。嗯,打开的话呢,这里边为,因为这个像第一个这个杠DC呢,它涉及到这个参数比较多啊,为了呢,能够在这一行都能显示出来,咱们这呢,稍微做一个修改啊,把这个呢,比如说咱们改成这个150是吧。直接改成这个150。哎,这样宽一点啊,这样方便我们去演示行,那这块呢,我们输入一下这个叫j data,然后呢,呃杠JC吧,哎这个还是这个9000的对吧?哎,好,这时候我们点一个这个回车。行,这时候呢,大家是不是就能看到我们当前的这个程序,哎,这个杠JC里边包含的这样的一些参数了。哎,这样的一些参数,这些参数的话呢,我在这儿呢,给大家呢,其实都罗列出来了啊,都罗列出来了,这个当然也不排除有的同学呢,可能还是有点不太熟,咱们一个一个稍微过一过啊,这个S0S1顾名思义,咱们再讲上品时候都说过,就是幸存者零区域,幸存者一区啊,青春者零区的一个capacity,它的一个容量啊,我这儿呢,写的是这么多。
04:20
呃,然后呢,这个一会儿咱们这个再拿另外一个例子给大家呢,再去说一下具体一个数据啊,咱们先说上面这个参数的意思,那这个呢,就是S1区啊行增者一区的一个容量,然后呢,这个新成零区的use已经使用的容量,已经使用的容量,这是S0S1的,这呢是我们这个伊甸园区它的一个总容量,已经使用的容量,这是我们老年代的一个总容量,老年代使用的容量,这个呢是我们方法区的容量,方法区使用的容量,这呢是我们压缩类的总容量,压缩类呢,呃,使用的容量就是样JC发生的这个样JC的这个次数啊,样JC花的这个时间,Four jc这个的这个次数啊,For jc的时间,还有这个总的JC时间,这个总JC时间呢,就是for jc的时间,跟我们这个样JC的时间,它俩的一个和啊,就是总JC的时间。
05:07
啊,这就我们说的这个情况啊,行,那这个程序呢,因为它不太具备这个代表性哈,因为我们这个程序呢,他也没有真正的意义上去执行,占用多少内存空间了,是吧,所以呢,我们就换一个例子啊。我这呢又写了一个例子啊,大家看到我这又写了例子啊,这个例子的话呢,我们是一个release,然后呢,我们循环1000次啊,在这个对空间里边,我们去创建了一个字节数组啊,100KB的把它呢添加到我们这个release当中啊,我们这个每个120毫秒,让它去这个执行一次啊,做一次添加这呢我还设置了这个参数了。啊,设置这个参数了,这个呢是我们对空间的一个标准大小,最大大小这个是60兆啊,这个设置呢,应该大家都清楚啊,这个在ID的这块呢,我们选中这个JC啊,找到它往这一扔过来是吧,就可以了,后边这个呢,就设置我们这个这个新生代当中啊,我们说的这个叫伊甸园区和我们的survivor区它的一个比例啊,8:1:1啊这呢也是我们说的一个默认行为,对吧?好了,那把这个参数也设置好之后呢,把这个程序呢,咱就跑起来。
06:09
跑起来了,那这时候呢,我们在这里边输入的叫GPS,查看一下当前我们这个程序,它对应的这个进程号行,那接下来的话呢,我们叫呃j state。啊接C点,然后杠,哎,我们叫杠JC吧,对应的是13252,哎这块呢,我们是不是还可以写一个,比如说1000,然后写个十。是不是就这个,每隔一秒钟打印一次,一共打印十次。哎,我们刚才呢,这两个参数interval和count呢,已经讲过了是吧?好,那这块呢,我们就能看到这个情况,那这里边首先关于这个S0新增零区,它的一个容量大小,注意这块我们看到是不是2048呀。啊,2048,那对应的其实是不是就是两兆的空间。两兆的空间对吧,这个是字节的单位啊,嗯,能理解吧,你看咱们这块一共是有60兆。那首先呢,是这个新生代和这个老年代的一个划分,这个咱们前面讲上篇的时候提到过,用哪个参数来进行控制啊。
07:08
哎,是不是我们有一个的叫做new ratio啊。哎,Raal是TIO是吧,用这个new racial呢去进行一个控制,默认这个值就是二,也是我们新生代呢占一份,老年代呢占两份,那它呢,新生代是不是就20兆,这个呢,就是40兆对吧?那20兆的情况下呢,我们有一个8:1:1,那意味着这个S0S1,它是不是就各两兆,然后呢,我们这个伊甸园区是不是就占了一个16兆啊,那就是1:1:8。这样的关系啊,那两兆的话呢,对应过来是不是就是我们说的2048呀。诶2048好,那这个S1呢,也是2048,这个呢是我们这个S0,它已经使用的大小没使用,这呢是它这个S1使用的一个大小啊,这呢是我们的叫伊甸园区它的一个总容量啊,是它的这个。哎,是不是八倍是吧,然后呢,这是已经占用的情况,这是我们这个老年代的,嗯,它占用的是我们说40兆百,嗯,这呢是它的一个总容量,这是它已经呃使用的这样的一个容量,后边呢,是关于方法区的一个情况啊。
08:09
哎,这呢是压缩类的一个总容量和它已经使用的一个情况,然后这里边呢,发行了这个样JC一次发生这个花费的时间呢,是诶这么多,然后呢,这个for这C没出现啊,没花费时间,总共的时间是这么多是吧?啊这个程序呢,现在那最后呢,是不是出现这个黑space了啊,但是咱们刚才演示的这个过程当中没有出现是吧?哎,这个大家稍微注意一下哈,啊,那咱们把它可以再跑起来一下。啊,把它抛起来,咱们再换一个参数来演示吧。这里边我们还有一个是不是杠JCUU啊好回车一下。哦,这我们这个进程是不是换了GPS啊。这个我们是6384。好,回车一下,这个咱们给他整多一点吧。
09:02
就来一个30次。啊,这个我应该把这个时间呢,是不是改的稍微的快一点哈。现在是每隔一秒钟才打印一次。这个呢,你看我们最终呢,是不是发生一个叫呃堆溢出了,那在堆溢出之前呢,是不是我们会发生这个GC啊哎,会发生这个for GC是吧。嗯,你看这时候我们发生过这个这些这个行为了。啊,让这些这个次数呢,你看也有所增加。好,那它这块呢,先跑着咱们看一看这个参数的这个意思啊,嗯,S0S1这个呢,是我们用的叫杠j CU u two啊,它呢,这块关注的就是一个占比的情况了啊,哎,你看这是一个占比的情况啊,占到98%了,然后这呢是我们这个一点园区它一个占比,老年代一个占比啊,方法区的一个占比啊,这是压缩空间的一个占比,好后边呢,还是这个时间的一个情况啊,这也是一个累加,你像这里边,比如说这发生了两次,这是哎这么多时间,还有这是这么多时间,你看把它们相应的是不是做一个累加和呢,就是我们这个数啊。
10:10
没问题吧,来合计我们这个数啊,嗯,这里边稍微有一点点这种偏差的一个行为啊,这个大家能够理解一下。嗯,0.024,你看这个一加是不是就是0.031是吧,哎,这个啊好,这个呢,是咱们说的这个,你看这个我们没有打印34整个这个程序呢,因为发生一个呃OM了,哎,所以我们这块呢,自然而然的就也终止了啊这个大家稍微注意一下这个情况是吧。嗯,好,这呢是说的这个叫杠JCU,还有一个呢叫杠jc cos是吧。哎杠,这次cos啊,也可以看一下它啊,我呢就不一个一个的都给大家演示了啊,大家呢,你可以自己呢去演示一下啊。这个我们跑起来还得重新执行一个GPS啊。Jc calls。
11:01
对应的是10288是吧,回车一下。这里边呢,我们看到它主要关注的是什么呀?Course,就是原因的意思,就是我们发生这个JC,哎,这个没有发生JC是吧?下边呢,你有这个JC了,你出现这个JC的话呢,这个原因是怎么造成的啊,这个我们在讲商篇日志的时候也稍微提过,叫alloc failure,就是我们新生代的空间不足造成的。那这块你看它都有显示这个情况啊。行,然后后边呢,他就哎就接着往后打印就行,这个course的话呢,它主要关注的就是我们这个,呃,JC出现的一个原因啊。行了,那这块呢,我就不过多的再去演示其他的了,通过这个呢,大家能够看到就是咱们可以针对于不同的这个垃圾回收的这个,呃,监视的这个数据哈,进行多次连续的一个监控,实际上呢,有点像咱们在上面的时候给大家演示过的是不是那个叫啊V收VM里边看到的这个情况是吧。哎,这个大家稍微注意一下啊呃,那也就是说呢,咱们使用这个JS date。
12:04
啊,咱们使用这个j state啊,使用它,哎可以呢,是不是在纯文本的这个状态下去监视咱们虚拟机内存空间的一个占用,包括垃圾回收的一个行为啊,对吧?诶,那么你要说这个从图形化界面上更好看,那咱们可以用这个VM或J啊,JMC啊,JO啊等等这样的一些工具啊,那些工具呢,当然更直观了,但是在我们实际的,注意咱们在实际的这个呃生产环境当中。那我们说呢,很多时候呢,是你不能够使用这个图形化界面的啊,那这个时候呢,我们就要使用一些命令行了,那我们就可以使用这个叫接state来进行内存空间的一个监控。啊,同时呢,我们说很多成员其实也习惯了去使用一些命令行的一些指令了,是吧?哎,所以这里边这个JS data呢,是非常重要的一个指令啊,这个大家呢,需要去掌握一下啊。呃,这是一个,然后另外的话呢,大家看到我这块还有关于这个杠T参数的一个经验啊,哎,大家看一下这个情况。
13:02
说呢,这个杠气咱们这块也提到过了,就是程序呢,一共执行了多少时间,对吧,那像咱们刚才这块呢,这个程序再跑起来也能够看得到啊。哎,然后呢,再把刚才这个咱们给他调出来。掉这个长的吧。嗯,这个呢是14024。这个,然后我们在这个杠JC的后面,我们来一个这个杠T是吧,程序执行的总时间,嗯,这个它可以我们在这个改一下吧,改成这个20好,我们做一个回车。啊,这个不够长了是吧,诶诶可以这样转转啊。嗯,这个不够长了,你看这个跑这儿来了是吧,这个time step的话呢,我们这是不是能看到这个程序执行的一个总时间呀。啊,这没问题是吧,哎,程序执行的一个总时间,好,那有这个总时间,我们能够挖掘出来什么样的这个有效信息,大家来看。
14:04
啊,大家来看啊,说我们可以比较Java进程它启动的一个时间啊,我们这个杠T呢,是不是就来衡量是这个启动的一个时间,对吧,比如我这块呢,不写这20,它就一直打印呗,那我就能够知道我们这个程序一直启动了多少时间,好这个启动的时间跟我们最后这个垃圾回收的这个GCT啊JC的这个time,我们可以呢,挖掘出来一些有有效信息,比如说呢,我们去监测。呃,两次,这个时间就是两次,你比如说上边我们监测了一行。哎,上边我们监测了一行,然后下边呢,我们是不是又检测了一行,然后这个时间跟这个时间差是不是我们就相当于衡量出来了,这个程序一共执行了多少。呃,秒是吧,哎,直行多少秒,然后呢,这个它可能这块会有JC这块呢,也有个这个JC,然后这两个JC的一个时间差,是不是我们就计算出来了,这个时间段之内JC一共花了多少时间呀。
15:01
能理解吧,哎,这些一共花了多少时间,然后这个时间毫无疑问是不是肯定比这个时间要短吧,比如说这个呢,是十秒的话呢,这个可能是0.0,哎四秒是吧,哎,十秒,这是0.4秒,就是这个时间的话呢,一定是在它里边的,那我们让这个JC,就是你增量的这个时间去除以这个时,我们就能够查看到垃圾回收是不是占总共程序执行时间的一个比例啊。我应该说的很清楚了是吧,那如果大家发现这个比例超过20%了,那说明呢,目前那个堆的压力就比较大了,因为我们垃圾回收的时间呢,稍微的多了一点啊,稍微的多了一点是吧,那如果呢,你发现这个比例超过90%了,那就意味着咱们整个这个程序的。90%的这个时间都用来进行垃圾回收了,那说明我们内存空间基本上就没有什么了啊,那随时就有可能出现oom了。哎,那就相当于是咱们到底查这个信息的,呃,作用是什么呢?我们要从这个信息里边是不是要挖掘一些有效的数据啊,哎,就是我们拿相应的两个时间段之内的这个GC的这个差值去这个除以你对应的这两个对应的这个啊time step的这个差值,看看这个比例的一个问题啊,去发现我们这个程序可能会存在一些隐患啊,这呢是我们说的它另外一个呢,咱们在呃上边提这个基本情况的话呢,也提到这个内存泄露的一个问题了啊,那这个内存泄露问题怎么去看呢?
16:25
也是通过咱们刚才呢说的这些参数来进行一个判别的,大家你看啊,刚才我们这个参数呢,该讲都讲完了,你看这个参数怎么去挖掘这个信息啊,大家看。我们在刚才这个演示的时候呢,大家能看到我们有一个叫ou是吧,这个ou呢,代表的是不是就我们这个叫老年代的一个使用的这个内存的一个情况是吧?诶使用的一个内存的情况,好这里边儿的话呢,我们比如说这个在一段时间之内呢,咱们测量了多组这个ou啊,就比如说我们刚才的这个时间段之内,我们测量了多组这个U,从这个里边呢,咱们找一个最小值。
17:03
啊,比如就它了啊,我们找个最小值,相当于呢,就是在这段时间之内呢,我们这个老年代它所占用呃,它使用的这个空间是这么多,然后再隔一段时间,我们再从这一组ou里边,咱们再找一个最小值,然后再隔一段时间呢,我们再找一个最小值啊ou那这呢,相当于是我们相当于也是一个抽样啊。抽样完以后呢,大家你呃,如果发现这个数据有这样的特点,什么特点呢,发现呢,我们这个老年代这个呃U叫used是吧,占用的这个情况的比例呢,越来越高,越来越高。那这时候呢,你就要小心了啊,因为呢,我们是每隔一段时间是不是抽取的一个数据。啊,抽取这个数据,那为什么说你直接就抽就完了,为什么从这一组里边抽一个呢,这个呢,就是避免我们抽那个数据呢,是一个奇异点是吧,所以我们从这一组里边的最小,从这一组抽个最小,保证这个数据呢,是一个比较稳定的一个情况啊这呢是涉及到这个统计的一个抽样的,抽样调查的一个一个技术了,啊这呢不是咱们不用多说了啊,这样更稳定一些,在这里边儿呢,如果你发现这个ou它的占用的比例呢,不断的向上涨,那就意味着我们是不是这个老年代里边不能够被回收的这个对象呢,就越来越多了。
18:15
那越来越多,那你就要想为什么GC没有把它清理掉,那有可能就会存在内存的泄漏问题。啊,这呢,就是我们通过刚才讲的这个参数,我们如何去啊检验咱们程序呢,是不是会OM,是不是会有这个内存的泄露问题,好,那关于我们这个参数呢,就说完了,整体上来讲,这个参数呢是比较强大的,需要大家掌握住。
我来说两句