JDK的命令行工具解析
1.jps :虚拟机进程状况工具
-q 只输出LVMID,省略主类的名称
-m 输出虚拟机进程启动时传递给主类main()函数的参数
-l 输出主类全名,如果进程执行的是jar包,输出jar路径
-v 输出虚拟机启动时JVM参数
2.jstat:虚拟机统计信息监视工具
参数: interval 查询间隔 count 查询次数
实例:
假设需要没250毫秒查询一次进程2764垃圾收集的状况,一共查询20次,命令为:
jstat -gc 2764 250 20
其他参数:
3.jinfo : java配置信息工具(实时查看和调整虚拟机的各项参数。)
jinfo pid
4.jmap: java内存映像工具(用于生成堆转储快照)
jmap vmid
其他参数:
例子:生成一个正在运行的idea的dump快照文件
jmap -dump:format=b,file=idea.bin 3500
5.jhat: 虚拟机堆转储快照分析工具
例子:
jhat idea.bin
分析结果显示:
6.jstack: java 堆栈跟踪工具(用户生成虚拟机当前时刻的线程快照)
命令格式:
jstack [option] vmid
例子:
jstack -l 3500
项目中查看堆栈信息:
for (Map.Entry<Thread, StackTraceElement[]> threadEntry :
Thread.getAllStackTraces().entrySet()) {
Thread thread = threadEntry.getKey();
StackTraceElement[] stack = threadEntry.getValue();
if (thread.equals(Thread.currentThread())) {
continue;
}
out.print("\n线程:" + thread.getName() + "\n");
for (StackTraceElement element : stack) {
out.print("\t" + element + "\n");
}
}
7.JConsole:java监视与管理平台
JConsole 监视代码
import java.util.ArrayList;
import java.util.List;
/**
* VM: -Xms100m -Xmx 100m -XX:+UseSerialGC
*/
public class TestJconsole {
static class OOMObject {
public byte[] placeholder = new byte[64 * 1024];
}
/**
* 这段代码的作用是以64kb/50毫秒的速度往java堆中填充数据,共填充1000次
* @param num
* @throws InterruptedException
*/
public static void fillHeap(int num) throws InterruptedException {
List<OOMObject> list = new ArrayList<OOMObject>();
for (int i = 0; i < num; i++) {
//稍作延时,令监视曲线的变化更加明显
Thread.sleep(50);
list.add(new OOMObject());
}
System.gc();
}
public static void main(String[] args) throws InterruptedException {
fillHeap(1000);
}
}
查看eden区的运行趋势呈折线状:
程序运行后,在“内存”页签中可以看到内存池eden区的运行趋势呈现折线状。而监视范围扩大至整个
堆时,会发现曲线是一条向上增长的平滑曲线。并且从柱状图可以看到,在1000次循环执行结束,运行了
System.gc()后,虽然整个新生代Eden和Survivor区都基本被清空了,但是代表老年代的柱状图仍然保持峰值状态,
说明被填充进堆中的数据在System.gc() 后,虽然整个新生代eden和survivor区都基本被清空了,但是代表老年代的柱状图
仍然保持峰值状态,说明被填充进堆中的数据在System.gc()方法执行后仍然存活着。
为什么执行了System.gc() 之后,老年代的柱状图仍然显示为峰值状态,代码需要如何调整才能让System.gc()回收掉填充到堆中的对象?
原因:System.gc()之后,空间未能回收是因为List<OOMObject> list 对象仍然存活着,fillHeap()方法仍然没有退出,因此list对象在执行System.gc()时仍然处于作用域之内。如果把System.gc()移动到fillHeap()方法外,调用就可以回收掉
全部内存。
上一篇: messagebox_AvaloniaUI的MessageBox
下一篇: 期末考试复习(王宁)