JVM性能优化工具 Mat使用

前言

本篇博客是只要是介绍JVM性能优化工具-Mat基础使用的笔记,若文章中出现相关问题,请指出!

所有博客文件目录索引:博客目录索引(持续更新)

Mat工具使用

下载地址:https://www.eclipse.org/mat/downloads.php

Java的gc_roots结构

image-20211118231813233

  • System Class:系统类,启动类加载的一些类,在运行期间肯定会使用到的,它们能够作为GC root对象。都是一些class的实例对象。
  • JNI Global(老师讲课是Nactive Stack,按老师的来):JVM虚拟机在执行一些本地方法调用时必须调用操作系统方法,操作系统方法执行时所引用的一些java对象,其也可以作为根对象。
  • Thread:指的是一些活动线程,活动线程中使用的一些对象不能够被当成垃圾。线程在一次次运行时会有方法进行调用,那么也会产生一个栈帧,栈帧内所引用的对象可以作为根对象,局部变量引用的对象都可以作为一个根对象。
  • Busy Monitor:java对象中具有同步锁机制,也就是synchronized关键字,若是使用某个对象作为锁,那么该对象自然也不会被当成垃圾被回收。加锁的对象。


实际小案例

1、查看主线程方法中某个根节点的存在

案例描述:在程序中我们通过进行一次强引用以及取消引用来构建快照,并使用Mat工具来进行监测根对象的存在。

import java.io.*;
import java.util.ArrayList;
import java.util.List;


/**
 * 演示GC Roots
 */
public class Main {
    public static void main(String[] args) throws InterruptedException, IOException {
        //list1是一个变量,存储在活动栈帧里,相应的对象存储在堆中
        List<Object> list1 = new ArrayList<>();
        list1.add("a");
        list1.add("b");
        System.out.println(1);
        System.in.read();//阶段1:构建快照

        list1 = null;//取消强引用
        System.out.println(2);
        System.in.read();
        System.out.println("end...");//阶段2:构建快照
    }

}

分别在输出1、2时创建快照,我们可以借助jmap来进行创建

# 获取当前运行程序的进程号
jps 

# 创建两次快照
jmap -dump:format=b,live,file=1.bin 10556  # -dump表示将当前堆内存的状态抓取转储成一个文件,format=b表示二进制,live指的是抓快照时只抓取存活的对象,垃圾回收掉的会进行过滤,注意设置live参数会主动触发一次垃圾回收。

jmap -dump:format=b,live,file=2.bin 10556

此时我们就会在指定目录得到两个.bin文件,接着来使用Mat工具来进行分析:

image-20211118233548807

image-20211118233632430

image-20211118233653443

查看GC roots对象

image-20211118233746131

快照1:

image-20211118234007219

快照2:由于jmap设置了live参数,所以在生成快照前进行了GC垃圾回收,并且由于已经对该集合对象设置了null,则表示不再进行强引用,那么此时垃圾回收就会将其清理掉了,自然下面也就查看不到了!

image-20211118234115491


参考资料

[1]. 性能优化工具(八)-MAT


参考资料

[1]. 性能优化工具(八)-MAT

[2]. MAT分析工具

我是长路,感谢你的耐心阅读。如有问题请指出,我会积极采纳!
欢迎关注我的公众号【长路Java】,分享Java学习文章及相关资料
Q群:851968786 我们可以一起探讨学习
注明:转载可,需要附带上文章链接

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长路 ㅤ   

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值