00:00
好,那咱们说完呢,如何去获取大部分文件之后啊,下边呢,我们就来看一看,使用这itt呢,如何去分析大部分文件行,那获取这块呢,我们可以呢,这不是讲了四种方式是吧,实际上呢,也可以归结成两种大的方向,第一种呢,就是我们的MAT呢,能够读取现成的这个单MP文件是吧,第二的话呢,就是我们可以呢,去实时的去根据我们正在运行的这个Java程序呢,这个及时的去生成一个大的一个对快照啊就是这样的两个思路,好那从上面这三个里边呢,咱们挑一个呃这个这个实现,比如我们就用第一种方式来实现,然后呢,我们再通过这个呃方法四这个我们也去生成一个这个大文件啊这样的两种方式来做,那这里边的话呢,我们可以打开啊,这里在MAT这个包下呢,写的这个程序,这个程序呢,跟咱们前面用这个程序呢,还是一样子的啊,那这呢也设置了相关的这个对空间的一个大小啊,这块我们稍微的来确认一下啊,找到我们这个editor,这里边针对于咱们当前的啊,这个没有了,把它删了啊,针对当前我们这个。
01:00
传媒这个包里边的啊,找一下这个叫oom啊。哎,OM的一个test是这里边的是吧,好,这个我们点一下这个OK啊,这里没设置,那我把这个参数呢,CTRLV给它加上啊可以了。嗯,它已经already exist了啊,那这里边我们还需要把这个重名呢,给他这个去一下是吧,那这个呢,确保是我们itt这里边的是他好可以啊OK,行,那接下来的话呢,我们把这个程序呢,给它跑起来。可以了,抛进来以后的话呢,我们诶WIN2一下CMD,呃,这个第一种方式呢,我们就使用这个解map呢,去生成一下这个大文件啊大家呢,再去回忆一下,首先呢,这个GPS我们看一下当前这个程序当中,这个呃,运行的障碍进程都有哪些啊,你要说看这个呢,比如要有多个重名的话呢,你也可以呢,是不是通过我们叫GPS-L一下是吧,这个咱们前面也提到过啊,是这个mitt这个包下的这样的一个这个扎va进程,然后接下来的话呢,我们通过这个解map啊回忆一下怎么写哈,呃,首先呢,是一个杠MP。
02:02
对吧,诶,然后冒号,然后这里边我们是不是还讲过叫live是吧,这个live的话呢,我们只需要找的这个叫存活的这个对象啊,比如说你要说想看这个完整的这个情况呢,我们就来一个叫a format,哎,然后等于一个B啊保证我们这个格式呢,是一个标准的格式,哎,逗号,然后呢,写一下我们这个file啊这右边呢,就不用加引号了,直接呢指明你这个啊h pro这个文件的存储的位置,那这里的话呢,我把它啊改一下这个存储的一个。呃,路径呢,我给他设置一个。诶,设置一个。文件夹啊,在这个D盘下呢,比如说我现在呢,先创建一个文件夹,我就要到MAT下建一个log吧。好,我就放到这里边啊好过来,然后呢,D盘下的MAT的log下,然后我们写个叫a.h pro。哎,就这样吧,后边呢,空格一下指明当前这个进程4568。诶回车一下,行,那这样的话呢,我们就在这里边,是不是就生成了我们这个a DR h pro这个文件了是吧?好,这就没问题,行这个呢,就是我们通过这个命令行MAT的这个方式呢去生成的,那这个生成完以后的话呢,我们回到这个嗯,T啊它这样的一个工具当中,你看这里边还写着eclipse了是吧?这个界面的话呢,现在是最简洁的,因为我们也没有去加载这个dump文件,那加载的话呢,我们就可以在这个file这块呢,大家选一下这个叫open。
03:25
啊选这个open open呢就是打开的意思啊,在我这个D盘下MAT的log,好,我选中它,诶选中它以后呢,我们直接选一个打开。诶就出现是不是这样的一个界面是吧?这个界面的话呢,其实大家呢,可以这块呢去点一个叫console哎,点一下这个console呢,也是可以的啊,那默认情况下呢,它这里边有第一个选项,这个呢,咱们先这个不过多的给大家去介绍啊,首先呢,你在这块看一眼,哎,当我们去打开的时候呢,帮我们生成了很多的,你看是点index,还有点TH这个结尾的一些文件是吧。
04:00
那在这个场景之下呢,你看我再去做一个操作哈。我把这个呢调过来放到这儿。哎,这个大家你看一眼,然后接下来的话呢,你看我做一个什么操作呢,我点一下这个finish啊。点了点完分解之后呢,大家再看这里边是不是多了一个叫点zip文件啊,这个呢,咱们等一下给大家去解释,这是什么意思,好这个呢,先是我们去加载了其中的一个这个h pro这个文件啊,大文件,然后另外一个层面呢,咱们说按照这个方式四的话呢,诶确保一下咱们当前这个程序呢,你看还正在执行。还正在执行是吧,它还正在执行的情况下呢,我们这时候打开在这个file这块呢,它有一个A块hip dump,你看它是吧,诶这个呢,就相当于是它可以呢,去实时的根据当前正在执行的这个Java进程,那我们点一下啊。这个呢,就类似于我们的这个GPS,这个操作能够列举出来,咱们当前执行的这些Java的一些进程啊,包括看GPS也有是吧,说明他这块就是使用的这个GPS啊。
05:01
这个在这里边呢,大家去找这个OM就可以了,哎同学说,诶这这怎么有多个这个OM,这个OM test呢,那你再看一下它这个进程号,哎45684568,哎4568你看都是是吧,哎,其实是同一个哈,显示的有点问题,然后选中完以后呢,这个时候呢,你看它这个路径哈,这咱把这个路径呢给它改一下,那我也改到这个这个MAT这个log里边,那根据刚才那个呢,咱不妨把它呢,就改成是一个叫B吧,好点个保存。这个还不对了啊。先点进去是吧,哎,然后呢是这样,哎保存一下好,这时候呢,我点一下这个叫finish。点了finish了。那跟刚才呢,我们是不是类似啊,哎,这个时候呢,相当于是它是从我们这个进程当中呢,实时的去给我们生成了一个大文件的一个快照,哎,对应的就咱们刚才讲的这个课件当中,这个说的一个是用的方式一,一个是用的方式四啊关于如何去获取大文件呢,这呢相当于是一个小结,这个大家呢,需要熟悉啊,需要熟悉能记住好,那这个程序呢,就先这样啊,然后呢,我们过来之后呢,这呢是实时的去生成了一个堆快照文件,那也会出现这样一个选项。
06:14
然后这个选项呢,哎,大家你过来这块看,此时的话呢,我们有一个A有个B,但是这时候是不是没有B对应的那个Z文件是吧?哎,你看这时候呢,只有A的,就是因为我们刚才在A的这时候呢,点过这个finish,好各位咱们首先呢,来看一下这个里边说的都是什么啊。这个首先看这个默认的第一个叫Les tax report,就是泄露的一些疑点的报告。啊,什么意思啊,就是它会自动的去检测我们堆的这个大MP文件啊,用于呢,查看哪些是可疑的内存泄露的这个呃,疑点啊,这是疑点的意思啊,那么这个报告里边呢,它会说明哪些对象呢,还始终存活,以及呢,他们为什么没有被垃圾回收进来所收集。
07:01
对吧,那就这个意思,那说到这个内存泄露的话呢,这应该是我们这个,呃,使用这个这个使用MAT呢,去解析这个文件呢,非常重要的一个方面啊,那我们说内存泄露,咱比较关心的就是说你这个对象的按说不用了。啊,这个我这,诶我这个小图标还出不来了啊。嗯,可以了,就这个内存中的这个对象呢,哎,明明已经不用了,但是呢,现在始终呢,却不能够被我们这个垃圾回收进来所回收,这就是一个泄露的一个情况是吧?所以这里边呢,我们就要去呃找这些疑点,说你这块没死,那为什么说你没有被垃圾回收机回收,这呢,就是我们说可疑的这些这个对象对吧?那默认的话呢,就他给我们生成这样一个报告,这也是咱们的一个选项啊,默认选项第二个的话呢,叫component report,就是组件的一个报告,它会去分析一系列这个对象的一个集合。啊,找找到这个相关可疑的这些这个内存空间是吧?呃,比如说呢,你有这些重复的字符串啊,有一些空的集合呀,或者叫终结器啊,或者叫这个弱引用啊等等,那这些呢,都是我们认为可疑的一些内存啊,正常去生成这样的一个report。
08:09
啊,一个报告是吧,行,那像这个中间器呢,弱引用,软引用,虚引用,我们再讲这个上篇的JC那块呢,都提过是吧?好下一个大家看哈,这个呢,就是重新打开一个之前已经运行过的这个reports。那之前运行过的这个之前存在的这个reports,它会保存在这个zip文件当中,呃,这个next to的hip dump就是在跟dump文件呢,在同一个目录下的这个zip文件里,好,那这时候大家是不是就明白了,就是咱们呢,针对于这个b.h pro这个文件的话呢,我们现在呢,是不是要默认你选第一个,它就相当于帮我们去生成一个泄露的疑点的一个报告。啊,那之前呢,你要是打开之前已经存在的报告的话呢,它会生成这个文件里边,那我们现在呢,是不是首次的去生成这个报告,所以说呢,它是不是就会在我们同样的这个跟B点文件在同一个目录下的啊,这个里边就生成一个它它呢,就是我们刚才看到的这个,诶泄露疑点的一个报告啊,这个报告呢,就在这个政府文件里了。
09:13
哎,所以呢,那会儿我们点击按钮的时候呢,出来一个A,那现在点按钮出个B啊,这个大家就清楚了是吧?好明白一下这个意思啊好,那这里边儿呢,我们就把它收起来了。那么这个A也好,B也好,那我们就呢,诶大家挑一个来看就行啊,暂时呢,比如说我们就看一下这个A啊,但是我们先看下这个A,呃,整个这个界面的话呢,这个inspector这块呢,我们先不管啊,主要呢,我们来操作的就是右边这一块,操作这一块的过程当中。啊,那颜色换一下啊,操作这一块这个过程当中呢,我们会看到左边相关的一些信息啊,它主要也是配合我们右边来使用的,这块呢,就是一个history是吧?哎,这个历史的一个记录而已啊行,那这里边呢,是帮我们生成的这个是不是就立呃,Suspect这个报告啊,哎,这个报告呢,我们暂时呢就先还不想看,那你就先看左边这个叫overview。
10:02
OV呢,就属于一个概述对吧?哎,一个概述情况啊,那先整个呢,咱们介绍一下啊,先整个介绍一下,诶怎么看这块出东西的是因为我刚才碰到他了是吧?诶刚才一不小心碰到它了,你看他就出来了啊行,那咱们先看一看,首先呢,这块有一个叫details,诶这块就记录一个详细的信息,比如说呢,当前我们这个dump文件的一个大小。啊,这呢是咱们这个大部文件的大小,那我们这个生成的是不是晚一些啊,那这个文件呢,你看相当于就奔着100多兆去了是吧?哎,这是这个意思啊,这呢是大部分文件的一个大小,这呢是我们整个这个文件当中涉及到加载的类的个数啊,一共是708个类的加载,这呢是我们整个这个,呃,当前就是你这生成这个大文件这一时刻哈,内存当中一共创建的对象的这个个数。这个是46000个啊,那这块呢,看你啊,这个就显然多很多了是吧。然后再右边呢,就是我们整个这个程序当前这一个时刻的时候呢,呃,快照的时候呢,它呃使用的这个垃圾回收器啊,一共是呃不是这个类的加载器是吧?啊一共是有四个啊还四个后边呢说你也可以去显示一下不可到达的这个对象的一个直方图啊这个咱们暂时呢先不关注啊,咱们暂时先不关注好,然后下边这块呢,你看呈现的是一个饼图哈,饼图呢就是biggest啊objects by returned size在我们保留的这个内存当中啊,最大的一个对象是多少?
11:27
啊,也就是说呢,我们显示了当前这个堆快照当中啊,这个呃什么呀,就是最大的一个对象啊,最大一个对象大家呢,把这个光标呢,你悬停到这儿啊,你看悬停到这儿的时候呢,在这块就会显示出来关于这个对象的一些详细信息啊,你看我要放到别的位置上,这个灰色的这儿,691.7KB,这呢是属于空闲的这个内存啊,哎,属于这个空闲的这个情况,这就没有了啊,你再点下边这个,你看一点点是不是也有啊,就在左侧呢,是不是这块就给我们呈现出来它的一个详细信息了是吧,那这块呢,就是我们这个线程,哎,这其实是我们这个主线程了啊,当前这个线程的一个编号啊,它的一个副类是吧?哎,等等等等等,那这呢是它的一个,哎,这是我们说叫shadow啊,这个浅堆啊对应的那个意思了啊,这个呢是算叫深堆的一个一个意思啊,这些root呢,是我们这个ad啊,就关于它的一个统计信息啊,这个我们后边呢,有很多的信息展开的时候呢,左边呢,是为我们要点击的一些信息服务的啊,是在这个左边这块啊。
12:25
好,这个呢,是咱们说的这个,哎,丙图的这两个情况啊,嗯,这个完了以后呢,我们再先看看上边这些啊,这也是咱们一会儿呢要给大家说的,嗯,这个这个这个I呢,其实就是我们这个overview了啊,你点其实就是它,比如说你现在在这儿是吧,我点一下它是不是就蹦到这儿了,哎,它本身就overview啊,然后第二个呢,叫做hisogram。啊,就是这个hisogram啊,跟这个标标标识是一样的,这个一会儿呢,咱们来具体展开说啊,这个呢,生成这个叫直方图,然后下一个呢,这个叫呃,Dominator tree啊就是我们一会儿要说的这个支配数的问题啊,然后再下一个呢,就是OKL,就是支持我们这个OKL这个查询语句啊,然后再下一个呢,就是我们关于这个叫呃thad的一个overview。
13:07
啊,Thread就我们这个线程啊,考虑这个线程的一个overview,行,这个呢,我们暂时也先不看啊,然后再往后这块呢,就是有一些相关的这个报告了啊嗯,比如说呢,我们这里边先看一看这个啊,这个呢是一个概述情况,我们了解一下,大家做一个点击,就是堆文件的一个over。啊,打开了是吧,呃,就显示出来我们当前这个A的a prop这个文件代表的这个大文件啊,它的一个概述情况,比如说你这个文件的一个大小啊,跟我们刚才实际上在这看的这个数据呢,它应该是匹配的上的,你看是吧。来把它盯一下啊,来过来。哎,这是它这个对文件的一个大小啊,大文件的一个大小,这个对象的一个个数。是吧?哎,这是一个概数啊,这是一个精确的数,呃,类的一个个数啊,在这儿,然后呢,Class load的一个个数,那这边都匹配的上啊jc roots,就我们说这个,呃,进行垃圾回收,有这个根是吧?根节点啊,这个根的话呢,它有674个,呃,文件的格式,什么时间生成的等等等等等等是吧?哎,都在这块有说明啊,行,然后下边呢,还有我们当前这个系统的一些属性啊,你看这块是不是也都记录了,像这些信息的话呢,说明是不是都是在我们这个大文件里边都有的是吧?啊,这都有它,然后还有呢,这个现成的一个overe啊,其实就跟我们点这个按钮呢,效果是一样的的,你看。
14:25
啊,只不过呢,还是以这个表格的方式呢,给我们做了一个呈现是吧?呃,下边呢,关于这个类的一个黑ogagram啊,它的一个呃,表格上的一个呈现啊,这直方图啊,这块呈现的对象的个数啊,然后呢,这个叫浅堆,这叫这个深堆是吧,它这个大小等等啊这呢就是当如果我们生成一些。这个报告相当于是啊行,那这呢是咱们说的上边这一排啊,上面这一排,然后再回到咱们这个OL,那接着咱们看下边这些信息啊。这个呢,黑ogram呢,诶跟咱们刚才点这个黑ogram呢,其实是一样子的啊,它其实就相当于生成我们,呃,是不是堆空间当中这个每一个类啊,它当中这个实例的一个个数和占用内存的一个大小是吧?给你这个呃列举出来第二呢,就是dominate tree啊支配数啊,支配数里边呢,能够显示我们每一个对象,哎,这个各个对象都给你呈现出来,以及这个对象呢,它所关联的其他的一些对象,以及呢,这个对象被哪些其他对象所关联啊等等,这个是一个支配数的概念啊。
15:22
呃,这里边儿呢,其实在我们分析这个内存泄漏的时候呢,也是常用的一个点,下面呢,叫top customer。啊,这个呢叫top customer,它呢能够通通过这个图形呢,去列举出来咱们最大的一个对象啊,最大这个对象的一个情况,那这块呢,是不是我点击一下就出来了俩对象就他啊嗯,这里呢,咱们说一下啊,这个大家会看到这个图像怎么感觉好单一是吧?哎,如果大家你首次看这个mitt的话呢,感觉好像是没啥意思,那是因为什么呢?就是咱们当前举的这个例子啊。啊,比较单一是吧,咱们这个程序呢,写的非常简单,就是不停的去造这个picture,然后去生成在我们这个release当中,所以呢,这个图呢,你会看着没有那么。
16:02
没有那么那个很多很多层似的是吧,那实际上我们在开发当中啊,大家你要去分析一些大文件的话呢,这里边可能就会非常的丰富啊,这儿呢,你看呈现出来的就这三块,哎,这个呢,属于一个一个空白的是吧,哎这三块然后呢,你也可能会会更多是吧?哎,可能会更多,然后呢,根据我们,哎,你说我这时候出现OM了,或者呢,我发现这个for现在出现的这个次数呢,比较频繁了,那我们去怀疑呢,有一些内存泄露啊,那此时的话呢,大家就可以生成一个大文件,里边呢,涉及到这个信息呢,它可能就会非常的丰富了。那这里边呢,你肯定最关心的哈,我们最关心的是不是先从这个大的开始去做一个排查呀,啊大的也有可能就是我们希望保存的这个数据,那你就接着去排查这个其次的这些,那你看看到底哪些呢?哎,是有这个内存泄露这个一点的,我们把它呢就给它分析出来,然后呢,你给大家解决一下就完了是吧,哎,就是哎,实际上这个饼图的话呢,它可能这个涉及到的这个相关结构内存呢,它会非常的多啊,一小块一小块的,只不过咱们这个呢,就看着比较单一一些而已啊,这个注意一下。
17:04
好,再回过来,嗯,下边这个就wlicate classes,就重复的一些类,什么意思啊,就是有可能,嗯,咱这个咱们讲这个中篇的时候提到过这个事儿啊,说呢,比如我们这里边有一个DEMO这样的一个类。啊,那正常来讲,我们说这个一个类的话呢,在内存中按卓只加载一份,当然这里有个前提,就是它得使用同一个类的加载器,就是class load1这个类的加载器呢,它只会加载一个DEMO,你要再去加载它就不了,它就呃始终还使用你已经加载这个DEMO就行,但是如果呢,我们要是再换一个类的加载器,是不是有可能会重新再加载一个新的DEMO类啊。啊,也就是说呢,同一个类它是有可能被多个不同的类的加载器,是不是多次加载的呀?啊这是我们就要分析一下,看哪些呢,是被这个重复加载了啊被多个这个类的加载器是吧?哎,就这个意思啊行呃,然后的话呢,大家你看这个reports这块呢,哎,其实你看我们这是刚才自动生成的这个啊,这都是咱们点出来的,哎像我们把这些呢,比如大家都给它关掉,那其实我们点一下这个按钮。
18:03
啊,就跟咱们刚才说这个自动给我们,诶,就一开始进来界面的时候,不是出来一个框,我们点的是其中的第一项那个圈点嘛,哎,如果呢,你点的是一个console取消了以后啊,你也可以呢,通过刚才的这个按钮啊,这个超链接呢,让他帮我们去生成这样的一个report啊也是可以的啊诶你看这里边呢,就针对这个report就是一些呃泄露的一些疑点啊,你看我们这个对象呢,是不是超大呀啊,那最终呢,可能是不是就导致我们这个内存会出现一个。嗯,这个咱们最后呢,运行结果是不是就OM了,哎,它出现OM呢,两种两种可能性,一个呢,就是我们这个内存呢,可能分配的确实小了。啊,就是,呃,这里边这个数据呢,都有用啊,内存小了,那就OM了,那还有一种情况呢,是不是就我们这个a link memory link是吧,I link啊,就出现我们这个内存的一个泄露情况了啊,那这里边呢,明显我们能看到此时这个内存空间当中这个对象呢,超大,那这个对象呢,就是我们要怀疑的一个点,那这块也写了是吧,说在你这个线程当中,这个酶方法里边啊呃,它这个整个这个对象啊,有个局部变量啊,它这个大小呢,是这么大啊,占到整个这个97.9%啊这样的一个比例啊。
19:12
呃,这个object的啊,等等等啊,就是还是他这个对象,然后对他进行说明啊,你可以去追踪一下他是吧?诶所以这里边呢,就是相当于是给我们一个非常好的一个呃提示啊,然后根据这个提示呢,我们去分析啊,是不是有这个内存泄露的这个问题啊行,那就先简单说到这儿啊,就整个呢,对这个嗯,MAT的这个界面里边的主要些功能键啊,咱们先做一个概述,然后下边的话呢,我们再展开呢,去一个一个的去说里边的一些细节问题。
我来说两句