00:00
好,大家咱们接着呢来讲下一个这个工具啊,这个工具呢,叫做eclipse MAT啊,这里边儿大家会看到带了一个eclipse对吧,那这个开发过的呢,应该多少都知道哈,这个eclipse呢,属于跟我们idea呢并列的另外的一个开发工具,只不过呢,现在呢,我们用idea呢会更多一些啊,以前的这个王者呢属于eclipse是吧。啊,这个呢,30年河东30年河西啊,就当时呢,觉得eclipse呢还这个用的还挺好使的是吧,想着说诶有一天呢会有一个工具替换它,觉得还不可思议,那现在来看的话呢,确实idea呢比eclips呢要更好用一些,而且呢,一旦呢大家开始用idea之后呢,哎就回不去了是吧?哎,就不愿意再用这个eclips了啊感觉呢,他就像这个诺基亚手机一样,而我们这个idea呢,有点像现在这个智能手机是吧?哎,就不愿意回去了,好,那我们这里边呢,说怎么带一个这个eclipse呢?哎,应该大家呢,也多少了解过这个MAT啊。好,我们这里边呢,给大家介绍一下,首先呢,这个mitt的话,它这个全称叫做memory and to,就是内存的一个分析工具啊说呢是一款强大的Java内存诶,堆内存的一个分析器,用于呢查找内存泄露啊,以及呢查看内存的一个消耗情况。
01:08
啊,这呢就是关于它的一个最简洁的一个介绍啊,但这里呢,大家看到是关于这个堆内存的一个分析器,那我们知道这个堆内存的话呢,最终体现在咱们是不是可以生成一个叫做MP文件是吧?哎,那这呢,我们相当于这个MAT呢,主要呢,就是来分析这个MP文件的。啊,我再说一遍啊,这个T呢,它的主要作用就是来分析这个MP文件的啊,像咱们上面讲这个VVM的时候呢,还到了它有很多的这个功能啊,其中这个文件呢,只是其中的一种啊,一个是吧啊一个重要的体现,而这个大文件的一个分析啊,应该是MAT最擅长的。这呢是从mitt的角度哈,那如果从这个大文件分析的角度来讲的话呢,也非常推荐了大家去使用这个MAT。啊,这个因为他专门干这个啊,那相当于相应的它做的是不是要好一些是吧?好我们接着往下看,呃,刚才提到说为什么itt呢,跟这个eclip挂钩呢,就是因为这个itt呢,它是基于eclip开发的,或者换句话说呢,它其实是eclipse它的一个插件。
02:07
啊,只不过这个插件的话呢,我们也可以呢,去单独的使用啊,也可以单独的使用,那大家呢,可以通过呃,这里呢,给大家的这个链接地址啊,在这个浏览器呢,你输入进去啊,CTRLV一下啊,这个回车一下。然后这呢,我们就能够去下载啊,相对来说现在比较新的呢,是这个01:11,然后大家呢,可以根据自己的操作系统,这个情况呢,我们去点击下载就可以了。啊,这就这就可以行,然后这块的话呢,我在这个课件当中呢,给大家也提供了啊,这个是媒是吧,哎就是它啊行这呢是我们说的关于这个软件的一个下载。呃,下载完以后呢,直接大家进行解压就行啊,直接解压就可以了,我这呢是哎把它呢就解压到我对应的地盘的,哎开发工具啊,我这有一个啊memory and就它是吧,这个呢,不用你去下一步下边安装啊,直接解压完以后呢,它就会来生成这样一个文件夹,里边呢有这个媒啊直接双击呢,其实就能够启动起来啊,这我们双击一下。
03:08
哎,这就启动起来了啊,这呢相当于是一个欢迎界面啊,这个我们就来叉掉,这呢就是它的一个主界面。啊,这个主界面啊,右边你还没有东西是吧?啊,因为这呢,我们还没有,是不是加载那个大文件呢哈,行我们接着往下再说明一方面的话呢,我们说可以直接呢,这个以独立软件的方式呢,进行一个下载,另外的话呢,大家也可以啊,就以这个插件的方式呢,在哎在这个eclipse当中呢,进行一个安装。啊,直接呢,在eclipse这个marketplace里边啊,你去输入MAT啊也可以呢,进行一个下载啊,这就可以了啊这个比较简单啊,那因为大家现在不去基本上不去使用这个eclipse了,所以你就单独做一个软件安装一下就行。好,那刚才呢,提到了这个MT,它的主要作用呢,就是来分析这个堆内存的,而这个堆内存的话呢,在我们生产环境当中,我们通常呢,是不是以大文件的方式呢,去记录一下整个这个程序在执行过程当中的一个内存的一个执行情况,是吧?那这里边儿呢,我们就需要生成这个大文件,好,那关于这个大文件呢,前面咱们已经介绍了挺多了啊,这我们再稍微的温习一下啊。
04:12
首先的话呢,提到说MT呢,它是可以来分析这个文件的,或者它主要就是来干这个事的啊,那么在分析内存的时候呢,这个只要获取到了当前设备内存映像的h pro这个文件啊,咱们前面呢,生成的这个内存映像文件呢,呃,堆的这个转储文件是吧,都是这个h pro这个格式的,那我们就可以通过MT呢去打开。然后呢,在我们这个打开的这个H这个文件当中啊,我们在MT当中就能看到如下的一些信息啊,这个呢,大家也先整体了解一下啊,如果说呃,面试比如问到了说你这个文件里边都有哪些信息啊,这个你根据你日常的一个操作,哎,得能够说出来,这个咱们一会儿呢也会给大家演示啊先呢整体介绍一下。首先的话呢,它包括所有的这个对象信息,包括呢,对象的实例成员变量啊,存储于占中的基本数据类型和存储于堆中的其他对象的一个引用值。
05:05
啊,这个都有啊,这个所有的对象信息啊,你像咱们这个说到的什么呢?就是哎,我把这个呢打开啊,这个直方图是吧?呃,黑ogram这个通过这个直方图的话呢,我们就能够查看到,哎当前的各个类,以及呢,它创建的一个对象的一个情况,对象的个数,然后呢,占用内存的大小啊,这个都能看得到。然后呢,以及我们啊,还可以通过当前你这个对象,它有相互之间对象的一个引用关系啊,就能看到它里边有哪些这个成员变量啊,以及以及呢,我们还能够进入到那个成员变量里边,再去看它的下一层包括哪些其他的这个成员变量,依次呢,往力去递进啊就可以了。还可以呢,查看存在于这个站中的这个相关的一些数据,哎,站中呢,是不是就跟我们这个县城相关了是吧?哎,我们呢,也可以查看这个县城的一个概述的一个情况啊等等这样的一个信息啊好,下边呢说提到我们还可以查看所有的类的信息,包括class loader啊,包括类名称,它的负类,它的静态变量啊等等,这个呢,相当于也是一个追溯。
06:06
啊,也是一个追溯啊,一会儿呢,我们打开这个文件的时候呢,就能看到啊,它会记录它的负类的一些情况,包括呢,我们这个大文件呢,使用了几个类的加载器啊,上面也都会清晰的标识出来啊,这是它,然后下边呢提到叫jc root到所有的这些对象的一个引用路径。啊,这个咱们在讲上篇这个JC的时候呢,当时提到过这个内存泄露的一个概念,对吧?哎,大家应该还记得啊,那这个内存泄露的时候呢,我们专门就提到,或者我们讲到垃圾回收的时候呢,专门提到的概念叫做jc root啊,因为有很多root嘛,所以我们叫jc roots是吧?那通过这个呃,Itt咱们当时呢,带着大家也都分析过这个啊,这个jc root是吧?啊这个可以再翻过去再找一找啊。然后下边呢,就提到我们这个线程的信息,包括这个线程调用站啊,以及是线程的这个,呃,线程当中这个线程局部变量啊,这个呢,我们在这个thad overew啊这块呢,也会带着大家去看啊,所以这块呢,关于我们这个呃大这个文件里边有哪些东西呢?这块呢,大家先有一个呃感觉啊,你想想我们这个大文件的话呢,轻轻松松导出来是不是就几百兆啊,哎,所以这里边这个信息量呢,还是比较大的啊啊这是我们说的这个事儿,然后的话呢,我们提一下两点说明啊,第一个的话呢,就是这个MAT呢,它也是个工具,它呢识别的这个呃,对转储文件呢,也有格式上的要求啊,但是主流的这个厂家的格式它都能够识别。
07:29
啊,你只要是按照这个它能够识别这个格式呢,这个去生成这个对传文件就可以了,像sa公司,惠普和SAP的这个h pro文件啊,咱们的导的也是它对吧?啊或者是IBM的这个PHD这个文件都可以识别啊,就是主流的话呢,都是支持的啊,这个说明一下,那也有可能的话呢,一些特殊的小厂的特殊格式的这个二进制的一个对专属文件呢,就识别不了啊,这个大家稍微注意一下啊。好,这是我们说的这个事儿,然后第二个的话呢,就提到了说这个我们。嗯,MAT它最吸引人的地方呢,还是能够帮我们去生成叫内存泄露的一个报表。
08:06
啊,生成这个内存泄露一个报表,方便呢,去定位问题和分析问题啊,大家想我们生成的这个h pro这个文件,如果呢,像咱们在上一章当中讲到的。使用这个h head呢,呃,这个接呢去读取的话呢,呃,虽然说有一个网页,但是整体呢,给我们这个信息量呢,还是比较有限的啊,这个不太直观啊,所以我们开发当中啊,基本上也呃不太会去选择用这个啊解he。啊,这个大家稍微注意一下啊,而且呢,这个解开的是不是在我们这个JDK9和十当中,咱们说已经被干掉了是吧?好,那我们现在能够考虑使用的呢,一个呢,是我们前面讲到这个VVM啊,我们说呢,它既可以去生成对大文件,还可以呢去读取这个最大文件啊,但相较于这个visual vm来讲啊,这个诶我个人觉得这个MAT里边关于大文件的一个读取,它呢要更强大一些啊,分析力呢也要更强一些啊这个呢,诶我们这个相当于做一个交流啊,那么在这里边呢,其实有两个比较好用的工具啊,一个呢,就是我们这里边要提到的一个叫直方图。
09:08
啊,一个叫直方图啊,这个直方图呢,跟我们在第二章当中讲到的,使用这个解map调用的这个叫杠to啊是类似的啊是类似的,我们能够分析出来到底比如出现了这个内存的溢出了。到底呢,是哪些这个对象啊比较多造成的,占内存的占比是多少,通过这个黑色的话呢,能够很清晰的能够反映出来啊,也是我们这里边要说的这个直方图啊,跟刚才那个是一个概念啊,Crystal gram啊,然后另外一个呢,就是这里提到一个叫做支配数的一个概念。这个支配数呢,能够展示咱们这个大模快照当中每一个对象呢,它所直接支配的一些对象,然后那个对象还能再支配对象,说白了是不是就构成了一个这个链接的一个情况呀。对吧,哎,这样个链接的一个情况,那涉及到如果我们这个对象呢,要被回收的话呢,哎,如果这些对象呢,没有被其他引用所引用的话呢,是不是跟着也都要会被回收啊啊那这呢,就涉及到这个支配数,然后呢,诶在支配数之前呢,我们还要讲一个叫浅堆和哎这个深堆的一个问题,有点呢,像我们前面提到那个,呃,Java里边的叫深拷贝和浅拷贝的一个问题啊,这个有点有点像啊,或者呢,是一一对应的一个情况。
10:15
哎,这呢,就是我们到时候呢,要给大家讲解的,诶大家你会发现呢,就是我们这个MAT呢,在分析方面呢,还是不错的哈,但是虽然这样的话呢,我们说这个itt呢,它也没有说简单到一件可以完成的这个程度。啊,说我们直接呢,一个按钮下去,你就告诉我这个程序哪一行出问题了,什么原因造成的,分析的妥妥的,这个呢还做不到,哎,更大程度上呢,我们还需要呢,从MAT给我们展示这个信息当中,基于我们的经验,还有这个直觉来进行一个判断啊,说白了还是具体问题的具体分析啊,哎,这样才可以。行,这是我们说的哈,然后呢,这个下一个呢,就涉及到我们如何去获取这个大文件啊,其实呢,咱们在前面呢也都讲过了啊,这块呢,也算是一个小结啊,也算是一个小结啊,那如何获取这个大文件呢,我们在讲第二章当中就提到了,哎,当时呢,咱们讲了是不是两种方式啊。
11:07
哎,第一种方式呢,我们就使用这个解麦法,然后生成一个我们这样的一个诶大文件就可以了,哎,等一下呢,咱们就把它呢再回回顾一下啊,可以写一写,然后另外一种的话呢,就是我们在程序当中啊,去配一下这个GM的这个参数。啊,那一个参数的话呢,就指明,比如我们如果使用的是它。咱们在这个第二章当中演示的时候呢,用的就是这个参数,就是当我们出现这个OM的时候呢,我们去这个生成一下这个大文件是吧?哎,那当然你也可以呢,去设置成,比如在出现这个for jc之前,我们去生成这个呃,大文件啊都可以啊都可以。所以这个呢是可以这个不同的啊,然后下一个的话呢,我们需要指明就是你生成的这个大文件呢,它的一个保存的路径是在哪儿啊,这就是它的一个pass,嗯,然后呢,就会放到你相应指定这个位置上了,但是如果大家要是没有指定咱们这个呃,Hi dump这个pass的话,加个杠是吧?哎,如果你要没指定的话呢,它就默认的是生成在你当前这个文件路径下了啊,这个大家稍微注意一下啊,那一般的咱们都会去设置这个参数。
12:07
呃,下边呢,是关于他俩的一个对比,就是在实际这个生产环境当中啊,我们说一般呢,都会采用这个离线的方式啊,就使用我们这个解map,解map这个方式呢,去生成啊,然后第三种方法呢,就是咱们上面讲这个。哎,讲这个微收VM的时候呢,咱们其实提到过,它不是有个按钮嘛,直接一点是不是就生成这个大文件了。对吧,哎,这个咱们演示过了啊,我就不在这再演示了,然后第四种方式,哎,注意一下第四种方式,毕竟呢,我们现在这个MAT呢,它是要分析这个大文件的,你得先给我整一个是吧?啊那刚才我们上面讲的这三种方式是不是也都得先保证你先生成一个实打实的一个文件了,然后的话呢,我们把它导入就行,而这个方式四的话呢,就说它也可以不依赖于一个已经生成的这个最快照,它呢还可以自动的从活跃的这个Java进程当中去导出一个最快照,说白了就是,哎,你们要没给我的话呢,我也可以自力更生,自己呢导出一个最快照啊,也是OK的啊,下边呢,就是具体的这个操作了。
13:03
啊行,然后这呢,就是咱们先整体呢做了一个概述啊,那下边的话呢,咱们就来看一看这个,呃,大部分文件啊,一个是它的生成,一个呢是我们具体的一个分析啊,咱们下边呢就展开来说明。
我来说两句