00:01
好,同学们,咱们接着往下整啊,接着咱们看一下这个JC日志相关的这些选项啊,这个咱们下一章呢,其实就专门再去带大家去分析和熟悉一下这个JC日志啊,那现在呢,咱们既然讲到这个参数这一块呢,咱们就在这一章呢,先把这个日志相关的这个参数呢,给大家呢过一遍啊,这个JC日志相关这些参数呢,我们说还是比较重要的,我们通过呢,这个JC的相关一些日志啊,对于我们去分析整个这个程序啊,包括呢,对于内存的相关的一个分配啊,看看是不是合理啊,进行调优啊,其实还是起到一定的一个指示作用啊好,那这呢,我们就看一看这个JC日志相关的参数都有哪些,那这里边呢,有些参数其实在咱们讲这个上篇的时候呢,已经带着大家呢熟悉过了啊,这块也算是一个复习啊,这个我这块呢走一遍,然后大家呢,你该记的啊,还得记一记是吧,主要呢,其实下来还得自己。实际的去操作一下啊好,那我们就开始了,首先呢,这个叫ver bos jc啊,这个你一看这个格式呢,是不是就相当于咱们。
01:00
一开始讲的那个标准参数类型对吧?哎,在这里边呢,就是这个我boss啊呃,然后第二个呢,叫杠XS冒号加号啊叫print j c啊这两个呢,其实本质是一样的啊,都是输出这个JC日志的这个信息啊这个。比较简化的一个这个信息是吧,下边因为还有一个叫details啊行,那这里边我们就随便挑一个啊,CTRLC一下,比如就这个我不JC了,嗯,咱们回过来这儿呢,我又写了一个程序啊,关于我们这个j c log的这个程序啊,这个程序呢,也比较简单,就是一个release,通过一个循环的方式呢,往里边去加数据,OK,呃,那我们就来给大家做一个添加哈,呃,首先的话呢,我们也有这个基本的这个信息,我这样啊,把这个整个CTRLC一下。添加到咱们当前这个jc log的这个里边,针对我们这个四啊,它OK没问题啊,这个数据粘到这啊,我both冒号JC好up k呃,Apply一下,然后OK啊,此时呢,我们做一个这个执行。这时候我们看下这个输出的一个效果情况。
02:00
好,你看这时候呢,出来这个JC啊,这个JC呢,是因为新生代分配失败造成的啊,这出现了一个这个JC就是新生代的一个JC了啊后边呢,出现了我们这个叫for GC是吧。大家看到这时候这个信息呢,其实相对来说啊,跟我们一会儿这个信息比较起来说呢,就比较简洁一些,详细的这个内容呢,我们暂时就先不说了啊,这个咱们下一章的时候呢,给大家说一下这个日志的一个细节啊,CTRLC一下,好,那因为我们还要分析其他的一些,所以不妨呢,咱们这块呢,给大家呢,专门记录一下啊,咱们来记录这个JC的一个log文件啊。OK。嗯,行,CTRLV一下,嗯,这呢相当于咱们使用的啊,我这这么着标识一下吧,因为一会儿还有别的,咱们现在使用的是这个,我bos j c ctrl c一下。我就这样加一下吧,使用的它或者呢,大家你去使用这个杠XX冒号,然后加号叫print,诶print这个JC这两个呢是一样的啊这个你要是感觉有点担心的,咱们就CTRLC跑一下试试。
03:00
过来在这把这个我bos j c呢去掉,换成我们这个print j c,好,然后我们这时候再去执行。再跑起来。看一下这个数据显示的是不是跟刚才这个整体形式是一样子的。通过这一个呢,其实已经看出来了,其实一样对吧,没问题啊。好,这块呢,我就嗯不刻意的再去等它了,那这个打印出来这个效果呢,跟我们这个呢,其实是一样子的啊,信息量呢是相同的,那接着呢,我们来看这个第二个,第二的话呢,其实叫print jc details,那就加了一个details说呢,它能够显示垃圾回收时打印内存回收的一个详细的日志,比上面呢这个信息量稍微多一些,同时注意它还会能输出呢,咱们最后进程在推出的时候呢,内存各个区域的一个分配情况啊,占用情况,这个呢叫print j c details好回过来。然后咱们找到这个位置打开它这呢叫print j c,这个呢,我们就加一个details,有的时候呢,我们会看到这个,有时候网上有一些这个这个这个成员贴出来的一些这个日志分析,经常会把这个指令,还有刚才我没有加details呢,都写上,其实呢是没有必要的,就是这个print j c details,它是可以独立使用的啊,来我们看一下。
04:17
跑一下。那那我们这块呢,也稍微的做一个记录,嗯,把这个整个给它展过来。那我们现在来演示的属于这样一个指令,对吧,没问题。不对啊,Details啊。这个是吧,好。嗯,这样啊,好,回过来我们看一下这里边儿这个数据程序呢,已经终止了。嗯,这个呢,刚才大家没有看那个效果,就是我们再进那个JC的时候呢,他就呃这个随时性的执行了JC就输出一个,执行一个输出一个,然后等我们这个程序在最终结束的时候呢,是把我们这个你看堆空间相关的这个内存占用情况呢,给我们做了一个罗列,这是最后的时候程序进程退出的时候呢,做了一个罗列啊CTRLC一下,我把它呢粘到这儿,那很明显呢,大家会发现呢,当前这个信息量呢,是不是就更丰富一些,分成两部分,上面呢,就是我们相应的这两次这个相当于是样机器了啊,下边是这个for机协里边这个信息量呢,就比我们上边这个量要更丰富一些,看它最后啊,这个还涉及到这个新生代,老年代,这个加一起的之前和之后的一个。
05:22
这个这个占用情况是吧,然后这块呢,涉及到了我们比如说这个用户态呀,内核态呀,还有我们这个实际的这个耗时啊是多少。好,这呢是相当于我们这个print j details的一个说明,这里边呢,哎,我希望在这块呢,我加一个说明,这呢是表示呢,它是可以独立使用啊。可以独立的去使用,那我们下边这个呢,它俩是一样的啊,都是独立使用,嗯,而我那个print j details呢,也是可以独立使用的,这点一定要注意,那如果呢,我们要把这个和这个都加一起是什么效果呢?那其实呢,最后打印出来的就是以我们这个d tos为主了。首先呢,不会说都出了没必要对吧,因为我们这个details里边包含了这个这个非details就是呃,这个更详细嘛,所以我们就显示它了,嗯,其实呢,使用的时候大家就加它就行,不用加上边俩,然后呢,我们再看下边叫print j c time STEM,这个呢是输出JC发生的时候呢,这个时间戳行,那我们看这个指令能不能独立使用呢,我们回过来。
06:21
这个呢叫printer j c啊,我们把这个E去掉,是不是叫time stems是吧。Stems,这样写吧,Print j c time stems OK,好,这个写完之后呢,我们apply OK来跑一下,看看这个指令呢,是不是可以独立使用啊。嗯,我们这块呢,再给它整过来。好,这样子啊,然后回来。哎,大家其实已经发现啊,刚才我们经历一点时间,发现这里边儿没有任何的输出信息,其实呢,就有点单机了。你看程序结束了,这时候你会发现没有打印这个所谓的这个时间戳的信息,对吧,那也就是说呢,这个指令呢,其实它是不可以独立去使用的,那我们需要呢,补充上啊XS冒号加上。
07:07
这个呢叫print啊,这个j c details。诶,这个我们通常呢,咱们要用的话,都愿意加上这个details。行,那这时候呢,我们再做一个OK,再执行。这时候的话呢,就可以了。嗯,咱们这块呢,把这个也给大家粘一下。从这到这,CTRLC。你看这时候这个数据就能出来,这块呢,我们把它粘过来,就是首先得有它,然后呢,你再加上一个时间戳。这这就结束了是吧,好,我们把这个呢整个呢给它CTRLC一下。占到这个位置,那么这个呢,跟咱们上面呢,大家做个对比,你看后边这数据呢,该有都有,这块也都有,其实就多了一个这个,这个呢就是显示的咱们程序,嗯,就是当前这个进程,这个执行起来之后呢,呃,执行起来之后那一刻的这个GM,它记录这个时间到他当前发生这个GC的时候呢,经历的这个时间段,这是四秒多,九秒多,14秒多这个意思。
08:08
就是程序刚启动的时候,到当天你发生这个GC的时候呢,这个经历的这个时间,这就叫time STEM这个意思好,这个呢,完了之后呢,我们再来看下一个这个指令。下个这块呢,叫做date stems是吧?哎,Date日期这也是个时间戳,只不过呢,它加上了年月日十分秒了,看一下。我们过来,然后在这个位置,那很显然的话呢,我们这个你要用了这个date的话呢,这个time是不是我们就没必要去写了,所以他俩呢二选一就行,好这块我们再选中做一个执行。这块我们稍微等一等,让大家能也看一看,咱们其实最后那个堆空间的一个占比情况,是在最后的时候程序退出之前的输出的。啊,你看这块也能看到它打印的就是年月日十分秒是吧,东八区啥的啊。诶,你看最后在程序推出的时候呢,打印出我们这个对空间的一个占比,你这个这个这个新生代当中啊,总共多少用了多少啊,这是它内存的一个地址,这是这个伊甸园区啊,这个from区,Two区啊,或者叫survivor区,这是房间带这个这个这个原空间是吧?哎,这都标识Java里边呢,我们说叫圆空间了啊。
09:19
好把这个呢,我们整个CTRLC,嗯,拿过来。嗯,这个呢,我们粘到这儿啊,这个呢咱们演示的啊,我把这个呢CTRLC一下。拿过来,咱这呢叫做date是吧。啊DATE2好,这个呢,就是我们看到这个信息啊,他俩呢,还确实有点区别,那你需要哪个呢,你就用哪个就行,那我们刚才呢,通过一个简单的演示,就通过那个time的演示,发现这哥俩呢,是不是不可以独立使用啊。在这写一下。不可以。独立使用啊,需要配合。配合配合咱们上边的一般呢,咱们要用的话呢,就配合这个带details的了。
10:03
配合和他呢去使用。那就可以了啊行,那它呢,CTRLC跟这个呢是一样子的,对吧,好,这个呢我们就说清楚了,然后接下来我们看这叫print hi at j c。对吧,Print hi at这些CTRLC粘过来。看看这个是什么意思。嗯,在这呢,咱们就把整个后边这个参数就都干掉了,只保留最初的这个信息,CTRLV啊,就是在我们JC的时候呢,堆空间的一个情况啊,它其实呢,就是输出我们JC,呃,每一次JC前和JC之后呢,打印的这个堆的信息,看一下独立使用是不是OK。找一下。嗯,这块呢,我们把它也记录一下。哎,在这儿啊,用的是这个指令对吧。好看它看一下它这个能不能独立使用可以是吧。对吧,可以独立使用,不过他这个信息打印的好像还有点儿多。
11:02
成语已经结束了,那咱们把这个呢拿过来看看。走起来,走起来,CTRLC一下。好,回过来我们粘过来行,这个信息呢,还不少呢,我们看是什么情况啊,这是打印这个堆的啊,就在JC前和JC之后,这呢是我们进行的一次这个JC。然后呢,这是before啊,就是这些之前啊,这呢是这些之后内存的一个占用情况,然后这个呢,诶是不是我们又一次这个之前呢。啊,For这个其实不是个for jc这个呢,其实相当于我们一开始那个新生代的对吧?啊针对新生代那个minor jc这个之前的一个,诶之后的一个行,下边这块呢,相当于是我们发生这个叫forc了,呃,这是之前的一个,那这是之后,呃之后的是在这吧,之后一个,然后后边是不是还有一组这个之前的一个。那之后的一个。嗯,然后最后的话呢,你看他还啊这之后这是之前的这之后的是吧?啊那没了,就是这都是成对出现的啊,成对出现的好这个呢,就是我们看到这个打印是呃,垃垃圾回收之前的堆和之后的这个堆的一个占比情况,那要是这个里边再配合一个,它会是什么效果呢?我们CTRLC一下。
12:12
这个全靠大家的这个实操。哎,你想看一看这个实际效果呢,就自己跑一下就行,对吧,好走。他会不会把这个两个都混合在一起呢?看一下。能看出来吧。哎,你看。打印了,其实是吧,相当于呢,就算是个集合呗。对吧,是个结合,而且呢,大家看到最后当我们这个print j c details的时候。他。诶,这个往上啊,这个没在始写,就是我们加上这个指令之后呢,他不是最后的时候还要打印一下你整个这个堆的一个最终的一个情况,所以我们在这儿的时候呢,你看大家是不是也发现了,最后也给打印了是吧。啊,那说说这个的目的是什么呢?就是大家会发现呢,首先呢,就是咱们这个指令呢,它是可以独立使用的,对吧?诶CTRL一下啊,然后呢,你要是在它使用过程当中又加了一个print j details呢,那就把他俩的信息呢就合一起了。
13:09
啊就都有是吧,哎就这意思啊行这就过了,然后呢,咱们再看下边这个叫杠X log jc啊就相当于我们可以把啊像咱刚才呢,是都输出到这个控制台了,我这是把这个控制台的信息呢,给他打印到咱们这样的一个呃这个呃保存到这样一个文档当中了,那实际上的话呢,我们可以怎么怎么着呢,就直接呢,呃让他在相应的这个时间。这个执行的时候,把这个信息呢,输入到一个日志文件当中,好,那下边呢,咱们把它这个整一下子啊。比如说我们就想看这个信息吧,然后呢,在后边啊,我们就杠啊X这个呢,相当于是我们那个非标准里边这个讲的那个类型二说的那个杠X这个指令对吧,哎,Log jc我冒号一下,然后呢,比如我写入到D盘下的,我叫嗯hep log吧,哎,这样的一个log文件里边好写完了,写完以后呢,我们这里边做一个play,做一个OK,然后呢,我们就跑起来。
14:05
这就可以了,注意这时候的话呢,就不会把这个呃,日志的这个数据呢,输入到咱们这个控制台了,嗯,大家呢,就得去我们相应的这个我放在那个磁盘那个位置呢,去找了就啊。嗯,这个我就把这个就先去了。哎,这个呢,我们得稍微的等一下好结束了,然后的话呢,咱们找一下。我是放到了这个地盘下。D盘下,嗯,这是吧,好,我们把它打开。哎,大家会发现呢,这里边这个信息量呢,挺多的,嗯,除了呢,咱们刚才提到了keep at特JC啊,就是在你这个JC之前是吧?哎,JC之后,嗯,它这个信息之外,呃,相应的我们这个呢,呃,Print j c details这个信息你看也有,之外的话呢,大家会发现呢,上边是不是还有这样的一些信息的输出啊,咱们不是有一个叫print command line,哎这个命令嘛,你看这里边呢,其实我们在这个参数里边没加啊,但是它会输出的时候给我们写上。
15:03
那都写着呢是吧。诶,就是相应相应的我们这个log文件里边还有其他的一些这个辅助的一些信息啊,这就是这样一个情况,好,那如果大家呢,呃,需要的话,或者正常情况下,咱们一般呢,如果你想看这个日志呢,最后都希望它会自动的有一个输出的,所以我们都会加上这样的一个杠X log jc啊,这样的一个文件啊,这样的一个指令啊。行,那这呢,就咱们把这个事呢,就哎说清楚了,好,那这个呃,常见的我们去输出这个日志文件的这样几个指令呢,就说到这儿了,那其实除了之外呢,大家会发现我下边还列了一些。啊,还有一些更细致的,比如说如果呢,大家想去监控这个类的一个加载,监控类的加载可以用这个trains class loading啊,想打印这个JC时现成的一个停顿时间啊,用这个print j application stop time。啊,还有还有下边这个,比如说垃圾收集之前,打印出相应未中断的执行的时间,还有这个打印相关的这个引用啊,就是说我们回收的时候呢,到底回收了多少种不同引用的引用类型的这个引用啊还有这个呢,Printnuing distribution啊这个一看就是这个我们涉及到那个临界值,就是呢,在这个DC的时候,我们这个survivor里边那个对象,它的年龄分布啊,到底是多大了是吧?诶我们默认不是15的时候呢,要进入这个老年代嘛。
16:22
嗯,这个呢是use j c log file啊tation启动这个启用JC日志文件的一个自动转出啊,还可以自动转是吧。下面呢,就是number of j c log files啊,就JC日志文件的一个循环次数啊,循环数目包括呢,你还可以设置这个JC文件的一个大小啊,做一个这个控制等等,呃,都挺多的啊呃,随便我们演示一个吧,比如我们就看一下这个啊,把它呢CTRLC一下,打印JC时啊,现成的一个停顿时间啊好回过来这块呢,我们再打开。把这些咱就都给它去掉。
17:00
那这个都去掉了啊C背一下是吧,哎,Print j c applications of time啊就是JC的时候呢。我们看他这个停顿的这个时间啊,走一下。线程停顿的时间,那这就出来了,这呢就相当于我们发生了一次这个JC啊,停顿这个时间多少是吧,那这块呢,都给我们做了一个显示。啊,每次呢,你要有JC这块呢,就会给我们打印一条信息。行,这呢就是咱们说的这个啊,还有呢是吧?啊结束了,好这呢就是咱们相应的这样的一个字段啊,这个参数,其他这个参数的话呢,我就不一个一个去演示了啊大家呢,有兴趣的你可以自己呢再跑一跑,那这呢就跟咱们日志相关的一些选项呢,我就说完了,其中呢,最重要的当然是print j details。毫无疑问是吧,然后呢,这个日志输出到一个日志文件里边,这个呢,基本上也是我们必用的,那除此之外呢,还需要这个相应的时间,应该补充上这样的参数就行啊,当然呢,你监控的时候呢,需要每次看一看这个内存的一个变化,你用它也行啊,这是这样的一个情况啊好了,那这呢,日志相关的这个选项呢,咱们就说到这儿。
我来说两句