【java调优1】jprofiler简单使用

发布时间:2023年12月21日

一 编写测试类

主类死循环,持续接受控制台输入;输入a可创建3000个实体类;输入b暂停5秒线程;输入c调用d方法暂停5秒线程。

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class E {
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        while(true) {
            String a = s.nextLine();
            System.out.println("===========");
            System.out.println(a);
           E e = new E(); 
           if("a".equals(a)) {
               e.a();
           }
           if("b".equals(a)) {
               e.b();
           }
           if("c".equals(a)) {
               e.c();
           }
        }
    }
    
    public void a() {
        System.out.println("a");
        List<TestE> l = new ArrayList<TestE>();
        for(int i=0;i<3000;i++) {
            TestE e = new TestE("a"+i, i, "aa==="+i);
            l.add(e);
        }
        l.add(new TestE());
    }
    
    public void b() {
        try {
           System.out.println("b");
            new Thread().sleep(5000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    }
    
    public void c() {
        System.out.println("c");
        c2();
    }
    
    public static void c2() {
        try {
            System.out.println("c2");
            new Thread().sleep(5000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

class TestE{
    private String name;
    private Integer num;
    private String desc;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getNum() {
        return num;
    }
    public void setNum(Integer num) {
        this.num = num;
    }
    public String getDesc() {
        return desc;
    }
    public void setDesc(String desc) {
        this.desc = desc;
    }
    public TestE(String name, Integer num, String desc) {
        super();
        this.name = name;
        this.num = num;
        this.desc = desc;
    }
    public TestE() {
        // TODO Auto-generated constructor stub
    }
}

二 原审,启动

三 jp,启动

现在的jdk自带,在bin/jvisualvm.exe

屏幕左侧双击666进入运行的java程序(当前正在运行的才能狂暴鸿儒,run一下跑完的程序只会在这里闪一下,运行完就看不到了)

profiler标签,可查看cpu、内存情况。点击开始监控,且会消耗资源,不适合生产环境使用。

方法运行用时,但不能查看实例

四 其它流程

1 (win操作系统)cmd切换至bin目录,执行 jstat -gc pid (pid可看上述左侧)

可查看gc各代容量、已使用量,看是否有内存占用高、泄露溢出的情况。

  • S0C:年轻代中第一个survivor(幸存区)的容量 (字节)
  • S1C:年轻代中第二个survivor(幸存区)的容量 (字节)
  • S0U :年轻代中第一个survivor(幸存区)目前已使用空间 (字节)
  • S1U :年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
  • EC :年轻代中Eden(伊甸园)的容量 (字节)
  • EU :年轻代中Eden(伊甸园)目前已使用空间 (字节)
  • OC :Old代的容量 (字节)
  • OU :Old代目前已使用空间 (字节)
  • MC:metaspace(元空间)的容量 (字节)
  • MU:metaspace(元空间)目前已使用空间 (字节)
  • YGC :从应用程序启动到采样时年轻代中gc次数
  • YGCT :从应用程序启动到采样时年轻代中gc所用时间(s)
  • FGC :从应用程序启动到采样时old代(全gc)gc次数
  • FGCT :从应用程序启动到采样时old代(全gc)gc所用时间(s)
  • GCT:从应用程序启动到采样时gc用的总时间(s)

2 查pid

cmd 指令 tasklist

cmd 指令 netstat -ano

任务管理器查看进程pid

3 执行指令 jmap -dump:live,format=b,file=xxx/xxx.jprofile pid

导出堆文件至指定位置

在jvisualvm中可载入,查看导出的快照

查看概要信息

快照中的类

文章来源:https://blog.csdn.net/misakakagami/article/details/135107075
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。