MAT中的支配树 在使用MAT分析项目的内存泄漏问题时,其中有一个支配树(Dominator)视图。
上一篇文章概括的介绍了JVM Heap Dump文件生成的方式以及内存分析工具MAT的概要功能,今天讲解如何使用MAT的Histogram和Dominator Tree两个视图,定位到内存溢出源。...Dominator Tree视图 点击工具栏上的 ?...图标可以打开Dominator Tree(支配树)视图,在此视图中列出了每个对象(Object Instance)与其引用关系的树状结构,同时包含了占用内存的大小和百分比。 ?...通过Dominator Tree视图可以很容易的找出占用内存最多的几个对象(根据Retained Heap或Percentage排序),和Histogram类似,可以通过不同的方式进行分组显示: ?...定位溢出源 Histogram视图和Dominator Tree视图的角度不同,前者是基于类的角度,后者是基于对象实例的角度,并且可以更方便的看出其引用关系。
文章目录 问题描述 解决方案 Leak Suspects Dominator Tree Top Consumers 问题描述 新接手的项目,测试反馈页面同时点击速度快些请求就会报错,返回nginx 502...dump_pid3380.hprof 3380 下载对应的dump日志,通过MAT(Memory Analyzer Tool)工具查看分析对应的dump日志,结果如下: 重点关注下Histogram、Dominator...Tree、Top Consumers、Duplicate Classes、Leak Suspects 名称解释: Histogram:直方图:列出每个类的实例数量 Dominator Tree:支配树...Dominator Tree 通过shallow heap(浅堆)和retained heap(保留堆)的大小判断可以看到最大的其实是byte类型。
文章目录 MAT工具介绍 下载安装 使用 Overview Histogram Dominator_Tree OQL Thread_Overview Leak Suspects MAT工具介绍 MAT...包含了文件大小、字节码文件大小、对象文件大小、类加载器数量 Actions是常用的操作汇总, 与左上角的菜单功能相同 Histogram Histogram汇总了使用到的类的对象数量以及堆占用空间 Dominator_Tree...Dominator_Tree汇总了堆内存空间中占比最大的对象, 按照空间大小排序, 我们可以通点击左边的箭头符号查看当前对象的引用状况, 最右侧为当前对象所占空间比例 查看对象以及它的依赖:
下面的Dominator Tree是列出最大的对象以及其依赖存活的Object (大小是以Retained Heap为标准排序的) ?...Duplicate Class是通过MAT自动分析泄漏的原因 一般Histogram和 Dominator Tree是最常用的。...为了计算Retained Memory,MAT引入了Dominator Tree。加入对象A引用B和C,B和C又都引用到D(一个菱形)。...对应到MAT UI上,在dominator tree这个view中,显示了每个对象的shallow heap和retained heap。
再往下看,Actions一栏的下面列出了MAT提供的四种Action,其中分析内存泄漏最常用的就是Histogram和Dominator Tree。...3.1 Dominator Tree Dorminator Tree意味支配树,从名称就可以看出Dorminator Tree更善于去分析对象的引用关系。 ?...Dominator Tree中列出了很多MainActivity实例,MainActivity是不该有这么多实例的,基本可以断定发生了内存泄漏,具体内存泄漏的原因,可以查看GC引用链。...3.2 Histogram Histogram与Dominator Tree不同的是,Dominator Tree是在对象实例的角度上进行分析,注重引用关系分析,而Histogram则在类的角度上进行分析...将第一个和第二个hpof文件的Dominator Tree或者Histogram添加到Compare Basket中,如下图所示。 ?
所引用; with outcoming references outcoming 指出去 被该选中实例引用的实例, 即查看本 类型实例 引用了 谁/哪些类型实例;) 第三个按钮,Dominator...Tree(Dominator n.支配者,支配力,统治者;) 视图展示 每一个类型对象的 支配树(注意是每一个对象!!)...Histogram是基于 类型 分析,只分析类型, 不具体到某个实例, Dominator Tree是基于 实例 分析, 具体到 某个实例; !!!! ? ?
heapdump.hprof [pid] 描述:生成堆转储快照dump文件 dump内存镜像,我们就可以使用内存分析工具(MAT),查看各个类的引用链路,找到内存泄漏点 使用MAT分析 一般使用Dominator...Tree,因为一般对象的内存占用大小只是该对象本身的大小,不包含其引用其他对象的大小,Dominator Tree可以计算对象以及被其引用的其他对象的大小,这样就可以找到最终导致内存泄露的点 从MAT
._2).sum val numerator = product - (sum_vec1 * sum_vec2 / arr1.length) val dominator = math.pow...sum_vec1, 2) / arr1.length) * (square_sum_vec2 - math.pow(sum_vec2, 2) / arr2.length), 0.5) if (dominator...== 0) Double.NaN else numerator / (dominator * 1.0) } 余弦相似度 /** jblas实现余弦相似度 */ def cosineSimilarity
使用MAT定位使用内存最多的内存,再定位到代码位置 首先找到Dominator Tree,如下图: ? 打开Dominator Tree,按照内存占用从大到小排序: ? 找到占用内存最多的对象 ?
图 2:对象 C 的 Incoming references 在"Dominator Tree"中的 Object C 上单击鼠标右键,然后选择"List Objects",再选择 ”with incoming...图 3:对象 C 的 Outgoing references 在"Dominator Tree"中的 Object C 上单击鼠标右键,然后选择"List Objects",再选择 ”with incoming
Histogram汇总了使用到的类的对象数量以及堆占用空间 我们还可以根据实际情况对Histogram展示的数据进行分类 在结果的第二行中我们可以进行模糊查询 2 . 3 Dominator_Tree...Dominator_Tree汇总了堆内存空间中占比最大的对象, 按照空间大小排序, 我们可以通点击左边的箭头符号查看当前对象的引用状况, 最右侧为当前对象所占空间比例 2 . 4 OQL OQL...就不会回收, 这也是OOM异常的触发原因 2 . 7 . 2 Path to GC Roots 当前对象到GC Root的路径, 也就是当前对象的引用关系, 该工具只能展示单个对象的引用关系, 所以只能在Dominator_Tree
Allocation Tracker GC Root以及Dominator Tree 当Dump出来Java Heap之后,可以到处一个Android特有的Hprof文件,可以使用Hprof Viewer...来进行查看此类文件,并且在这个工具中会有一个Dominator Tree的图标,来标志GC Root(Depth为0)。
* Actions 这里显示了几种常用到的操作,算是功能的快捷方式,包括 Histogram、Dominator Tree、Top Consumers、Duplicate Classes,具体的含义和用法见下面...c、Dominator Tree(支配树):列出Heap Dump中处于活跃状态中的最大的几个对象,默认按 retained size进行排序,因此很容易找到占用内存最多的对象。...如果说需要定位内存泄露的代码点,我们可以通过Dominator Tree菜单选项来进行排查,因此仔细观察和分析才能够找到问题所在),如图1-2所示: ?...图1-4 泄露可疑点(1) 查看信息初步怀疑与J2EEsession超时检查有关,并涉及Hashtable实例的system class loader类,进一步通过Dominator Tree(支配树)
Dominator Tree 定义在这里。简单来说,Dominator Tree可以很好地观察Retained Heap大小。...通常,在dump中查看Histogram和dominator_tree就可以看出一些端倪,例如这个例子中,histogram图中,占用内存最多的是byte[]对象,通过右键 -> List object
通过《Accumulated Objects in Dominator Tree》视图可以看出,在该线程中,存在一个大的List对象,List对象内存放了大量的mysql的jdbc对象。...接下来我们打开《open dominator tree for entire heap》这个视图: ? 找到名为0x7c8ff3df0 pool-16-thread-1的线程。
通过《Accumulated Objects in Dominator Tree》视图可以看出,在该线程中,存在一个大的List对象,List对象内存放了大量的mysql的jdbc对象。...接下来我们打开《open dominator tree for entire heap》这个视图: [1592298722438012273.png] 找到名为0x7c8ff3df0 pool-16-thread
So it’s a child of C in the dominator tree. D is a little bit interesting here....So that means that A is the parent of D and the dominator tree....The histogram view and the dominator tree....Let’s take a look at the dominator tree. You remember the concept I explained....But that’s why the leak object didn’t show up in the dominator tree.
shallow Heap与 Retained Heap MAT还有一个重要的视图便是dominator tree(支配树), 视图里是将堆中的所有对象看成一张图,每个对象是一个图节点,而 GC Roots...dominator_tree视图
领取专属 10元无门槛券
手把手带您无忧上云