一 编写测试类
主类死循环,持续接受控制台输入;输入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各代容量、已使用量,看是否有内存占用高、泄露溢出的情况。
2 查pid
cmd 指令 tasklist
cmd 指令 netstat -ano
任务管理器查看进程pid
3 执行指令 jmap -dump:live,format=b,file=xxx/xxx.jprofile pid
导出堆文件至指定位置
在jvisualvm中可载入,查看导出的快照
查看概要信息
快照中的类