利用垫分析JVM内存问题,从入门到精通(二)

  

上一篇文章垫入门到精通(一)介绍了垫子的使用场景和基本概念,这篇文章开始介绍垫的基本功能,后面还有两篇,一篇是垫的高级功能,另一篇是垫实战案例分析。

  

三,欢迎页

  

使用垫子打开一个堆转储文件,解析完成后,默认会进入欢迎页,欢迎页里包含了一些常见的分析:最大内存占用分析,常见的分析动作,常用的分析报告,垫使用教程等等。

  

我们看下下面这张图,可以看出垫的主要结构和功能:
利用垫分析JVM内存问题,从入门到精通(二)

  
      <李>检查员:透视图,用于展示一个对象的详细信息,例如内存地址,加载器名称,包名,对象名称,对象所属的类的父类,对象所属的类的加载器对象,该对象的堆内存大小和保留大小,gc根信息。   <李>检查员窗口的下半部分是展示类的静态属性和值,对象的实例属性和值,对象所属的类的继承结构。   <李>堆转储历史:用于列举最近分析过的文件   <李>常用功能栏,从左到右依次是:概览,类直方图,支配树,OQL查询,线程视图,报告相关,详细功能,其中概览就是在刚解析完后展示的这个页面,详细功能按钮则是提供了一些更细致的分析能力。   <李>概览中的饼图:该饼图用于展示保留规模最大的对象李   <李>常用的分析动作:类直方图,支配树,按照类和包路径获取消耗资源最多的对象,重名类。   <李>报告相关:泄漏疑点用于查找内存泄漏问题,以及系统概览李   <李>组件报告:这个功能是一组功能的集合,用于分析某一类性的类的实例的问题,例如分析<代码> java.util。* 开头的类的实例对象的一些使用情况,例如:重复字符串,空集合,集合的使用率,软引用的统计,终结器的统计,映射集合的碰撞率等等。利用垫分析JVM内存问题,从入门到精通(二)   
  

四,基本功能

  

关于概览页面,我们再上一节已经进行过分析,这里不再赘述。我们在这一小节,将重点放在功能栏那一栏,即类直方图,支配树,OQL查询,线程视图等功能。

  

4.1类直方图

  

堆直方图是从类的角度看哪些类及该类的实例对象占用着内存情况,默认是按照某个类的浅堆大小从大到小排序。利用垫分析JVM内存问题,从入门到精通(二)

  

保留堆这一列的值是空的,因为对于某个类的所有实例计算总的保留堆非常慢,因此使用者需要按需计算。
利用垫分析JVM内存问题,从入门到精通(二)

  

在直方图页面,可以选择某个条目右键进行分析,例如对所有类的对象做一些分析动作。利用垫分析JVM内存问题,从入门到精通(二)

  

在直方图页面,还有一个重要的特性,可以选择一些其他维度进行分类分析,例如超类,类装入器,包。利用垫分析JVM内存问题,从入门到精通(二)

  

如果选择按照计划来分的类,则可以看到下面这种视图利用垫分析JVM内存问题,从入门到精通(二)

  

4.2支配树

  

支配树可以用于查看堆转储中占用内存最大的对象。在支配树中,对于某一层的节点来说,如果它们的父母节点没有被其他对象引用了,那么这写节点都会被垃圾收集器回收。

  

支配树可以用来排查是哪些对象导致了其他对象无法被垃圾收集器回收,跟类直方图类似,支配树也从类加载器,包等角度来看。

  

[图片上传失败……(图像- ec386f - 1550075801691))

  

4.3 OQL查询

  

垫提供另一种类似SQL的对象查询语言——OQL,可以用类似SQL语句的方式查询堆转储中的对象.OQL和关系型数据库具备类似的数据模型:将某个类看作是一张表,将该类的实例对象看作是该表中的行,每个对象中的属性看作是构成行的列。

利用垫分析JVM内存问题,从入门到精通(二)