00:00
好各位,咱们接着来讲下一个指令,叫做接map指令啊,这呢,你看我也列出来了,接map的这个主要作用叫导出内存映像文件啊,以及呢,叫内存的一个使用情况啊,显示内存使用情况这块呢,同样的啊,大家没有必要呢去死记硬背啊,这块既然显示它的作用,那一定能够是不是通过我们相关这个指令的演示能够看到它的这个作用啊,所以大家呢,还是通过呃,这个我这块呢,演示完之后呢,大家呢,自己也去操作一下啊,你自己操作完之后呢,自然而然的也就记住了g map的一个主要作用了。啊,这是这个事儿啊,那其次呢,咱们先要说一下这个解map的作用呢,其实可不止这两个啊,它不止两个,只不过呢,就是这两个呢,是咱们使用的比较频繁的,或者说准确的来讲呢,第一个使用的是极其频繁的,就是导出这个大文件这个事儿,那关于这个内存使用的,诶对应的是我们这个,它其实还有其他的一些作用。不管是这里边儿的使用一,使用二还是使用三,其实都是通过我们这个g map里边那个option参数来体现的,它这个参数呢,其实还挺多的啊,你看有这么多参数。
01:06
啊,这里边儿呢,只不过咱们最常用的是提到了其中的两三个是吧,两三个的作用呢,是这个啊先明确下这个概念啊行,那接下来的话呢,咱们对于这个g map呢,首先有一个整体的一个把控啊,诶来看一下。这个g map呢,它的全称呢,叫GM memory map啊,叫GM的一个内存的一个映像映射啊,这个map呢,你看在咱们这个Java当中有这个map的这个集合是吧?呃,其实我们最早接触map呢,应该算到中学的时候呢,我们讲一个词呢,叫做这个映射是吧。啊,基于这个映射的话呢,我们是不是才讲这个叫函数啊,啊叫function是吧?OK,那这里边儿这个映射指的是什么呢?就是咱们真正你执行这个程序的时候呢,我们会有对应的这个内存的一些使用情况,然后我们把它呢,这个映射到一个对应的文件当中,啊,我们称为呢,叫一个快照文件了。啊,那就是有这个映射的一个意思啊,这样的一个感觉是吧。
02:01
好,那么这个g map的作用是什么呢?你看这里写的一方面呢,是来获取dump文件啊,大文件是什么呢?诶,我们简单介绍呢,就称为叫堆转储快照文件啊,或者你叫堆内存的一个快照文件啊,快照呢,就是对当前这个时刻,哎,我们内存中相关的一些对象啊,一些数据啊,它的一些呃,占用内存的大小的一个记录啊,这是一个快照啊这样一个情况情况啊,当前时间点的,实际上呢,是在一个安全点上啊,S框这个位置记录的,呃,对转处主要呢,记录是我们这个堆内存的一个情况啊,它是一个二进制的文件。那什么意思啊,那就意味着呢,咱们生成的这个大文件呢,大家想用tit这个文本格式的文件打开是不行的,那这个二进制文件你不能够直接识别,我们需要使用专门的工具去读取才行啊,另外呢,就是啊,也有同学会,呃,刚开始学的时候,或者呢,这个也有在使用这个解map,但是没有想过这个事啊,为什么叫dump文件呢?啊,为什么叫damp呢?呃,主要原因呢,就是因为我们生成的这个堆转储快照文件呢,使用的这个指令啊,使用的这个指令呢,用到了这个杠damp这个参数,所以呢,我们就习惯上呢称为呢叫做大MP文件了啊这个大家注意一下。
03:15
好,那么除了这个作用之外呢,你看它还可以啊,还可以干嘛呢?说获取目标Java进程的内存的相关信息啊,这儿呢,我们就用的是一个叫杠hip这样的一个指令啊,杠hip那还可以获取堆内存中啊,你各个区域的一个使用情况,最终对象的一个统计信息啊,甚至还可以按照这个内存使用的一个呃大小进行一个排序啊,这儿呢,其实对应的我们叫杠黑这样的一个指令。啊还有呢,类加载的一些信息啊叭如说这个叫呃类加载一个相关的一些信息啊,这个就涉及到我们,呃,这里边看提到的还有其他的一些是吧?一个是我们这个呃相当于是拥久带啊对应的是为代表的我们这个方法区里边啊pro state啊记录一下我们统计啊class的为统计口径,呃,我们内存的一个使用情况啊,那其实呢,就对应的是我们相关的一个类加载的一个信息了,对吧?啊,因为类加载信息都在我们的方法区里边。
04:11
啊,还有其他的这样一些,OK,这呢就是对这个map呢,它的整个功能呢,进行了一个介绍,那要想看一下map如何使用呢,那当然也非常简单啊,直接CMD进来啊,大家呢,就输入这个叫a j map啊,这样我们直接写呢,能够显示出来,或者呢,你这个j map后边加上一杠H或者help一样是吧。好,那这里边儿呢,呈现出来就是解map的一个基本使用啊,包括呢,这里边的option都可以有哪些啊,都有哪些,那刚才呢,其实也提到了其中的几个这个情况对吧?行,那这块呢,我们就不看它了,包括呢这个官方的这样一个文档,大家呢,有兴趣你就打开自己呢学习一下啊,这里呢我也都看过了啊,咱们直接呢就集成过来,哎,方便大家快速上手,我这呢就把它直接翻译成咱们要讲的这个课程了。行,那大家呢,直接来看我这里边讲解啊,首先呢,我们来看一下这个嗯,解map它的基本的一个语法,刚才我们看这个命令行的时候呢,其实也看到了,在这呢,我又粘出来了。
05:10
它的基本语法呢,包括了这样的三种情况,第一种呢,就是直接解map法,后边呢,我们加上对应的一个option啊,就是这里边这些option,然后呢,对应的你的这个进程ID是多少写上,第二呢是一个option,后边可能有一些可执行性的一些呃代码之类的,那像我们这个大呢,呃,指定你要对传储的那个文件放到哪啊等等一些信息是吧,我们就诶需要去填写啊,这两个呢,我们都会展示。第三个的话呢,其实一看就能明白,就是我们这个远程访问相关的这个Java进程的一个情况啊,这呢,咱们就直以本地的来演示就行,远程呢非常简单是吧?啊,你要有远程,那允许你去操作的话呢,我们直接呢去连接就可以了。好,当然这个你得保证一个安全性啊。嗯,下边呢,就提到这个option呢,具体有哪些,这呢也稍微提了提,咱就不看这了,直接呢咱们定位到这儿啊,大家来看一看这些常见的option先呢,给大家整体做一个介绍。
06:02
这个option的话呢,我们打开之后呢,你看我这里用了两个颜色来标识啊,红色标识呢,呃,对应的其实就是我们这里边儿提到的解map的一个主要使用啊,导出内存映像文件,就是我们所说那个大文件,用的是这个指令,下边这两个呢,是涉及到我们对内存的一个使用情况,包括呢,类啊,对象啊,它的一个创建的个数的多少,呃,使用的是这样的两个指令,那其他这些的话呢,相对来说重要性就差一些。啊,这是其一,呃,我们重点关注的是这三个,其次的话呢,有一些这个指令大家会发现呢,只在Linux或者so这个平台上呢是有效的,在Windows下呢,我们是没办法去演示的啊,包括呢,我们这个JDK的不同版本啊,版本的不同也会导致我们相关这些参数呢,会有一些区别啊,就跟我们Java中API一样,可能在不同的JK当中有一些添加,有一些这个删除是吧?哎,这样的一些行为啊。好,那我们先整体呢做一个介绍。首先这个呢叫杠damp,它的目的呢,就是为了生成叫堆转储快照文件啊,我们就称为呢叫MP文件了啊damp文件,然后我们也可以呢,进一步使用这个杠up冒号live,一会儿我们也会演示哈,只保存堆应内存当中还存活的这个对象。
07:14
啊,在两个这个安全点之内,这个你要是生成那个对象的那个对象呢,我们就搞不定了啊,只能够记录在安全点那个位置上存活的这个对象啊,这是它的这个作用啊呃,那整个来说一下,我们这个大文件,它这个作用是啥呀。想想它这个作用是什么?哎,刚才我们其实也就说了一嘴,没细说是,哎,大家想,如果说咱们程序在执行过程当中出现了这个堆的一个溢出啊,或者咱们叫这个非堆的一个溢出啊,比如你这个方法区啊,Meta space啊,是不是也可能会出现这个溢出OM是吧?那出现这个堆溢出了,或者非堆的一个溢出了,那这时候呢,我们是不是就关心是什么数据导致的啊,你是哪一个数据导致我们出现这个溢出了。
08:00
啊,那这个溢出的话呢,我们是可能是有内存的泄露问题导致的呀,对吧?哎,长期这个数据呢,我没法去回收,是泄露问题导致的呢,还是由于我们确实内存呃画的有点小导致的呢?啊这时候我们就要进行分析,那分析的这个源头呢,就有数据,那这个数据从哪来,我们就诶可以从这个大文件来。哎,可以从这个打文件来啊,这就是我们这个打文件它的一个作用,然后这个呃,比如这个hip,它呢就是导出我们整个堆空间的一个呃详细信息,包括你这些的使用啊,堆的一个配置信息,内存的一个使用信息等等啊这个咱们到时候一演示大家就能明白啊,这个呢杠黑呢,呃,它呢主要是统计这个堆当中这个对象的一个统计信息啊,比如说各个类啊,各个类的你这个实例的数目到底有多少,呃,占用的内存到底有多少,而且呢,还可以按照占用内存的一个大小呢进行一个排序啊,这就是杠黑头啊,还有这样的live是统一的一个存活的对象。OK,然后下边呢,叫pro state哎,PMP啊,这个其实我们关于叫永久带啊,属于GDK7及之前的方法区的一个具体的落地的体现了啊,永久带的一个内存的使用情况,一看这个参数名是不是就很清楚对吧?下面呢就是杠啊finalizer infer啊finalize呢对应的就是我们有一个垃圾回收的一个线程,叫finalize这个线程,那线程呢,去回收这个不使用的这个对象的时候,我们有一个这个排排列的一个队列是吧?那它能够就把这个队列当中的这个需要被执行finalize方法这个对象呢,给我们展示出来啊,有这样的一个队列的一个展示啊,其实呢,就是打印咱们需要被finalize的这个对象啊。
09:38
仅在这有效,然后这个杠F的话呢,就是当我们执行这个杠大这个指令的时候啊,执行它的时候呢,如果没有任何响应啊,没有帮我们生成这个诶转储文件,我们这个加上一个杠F可以强制去执行啊,就这样一个作用啊,下边help呢,杠勾啊,这个我们就诶不多说了,哎这呢,咱们对主要的这几个option呢,先进行一个整体上的说明,那下边的话呢,咱们重点来说一下如何使用这个杠呢去导出啊内存映像文件。
我来说两句