欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JDK的命令行工具解析

程序员文章站 2022-07-16 13:19:49
...

1.jps :虚拟机进程状况工具

-q 只输出LVMID,省略主类的名称
-m 输出虚拟机进程启动时传递给主类main()函数的参数
-l 输出主类全名,如果进程执行的是jar包,输出jar路径
-v 输出虚拟机启动时JVM参数

2.jstat:虚拟机统计信息监视工具

参数: interval 查询间隔  count  查询次数
实例:
假设需要没250毫秒查询一次进程2764垃圾收集的状况,一共查询20次,命令为:

jstat -gc 2764 250 20

其他参数:

JDK的命令行工具解析

 3.jinfo : java配置信息工具(实时查看和调整虚拟机的各项参数。)

jinfo pid

4.jmap: java内存映像工具(用于生成堆转储快照)

jmap vmid

其他参数:

JDK的命令行工具解析

例子:生成一个正在运行的idea的dump快照文件

jmap -dump:format=b,file=idea.bin 3500

5.jhat: 虚拟机堆转储快照分析工具

例子:

jhat idea.bin

分析结果显示:

http://localhost:7000/

6.jstack: java 堆栈跟踪工具(用户生成虚拟机当前时刻的线程快照)

命令格式:

jstack [option] vmid

JDK的命令行工具解析

例子:

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区的运行趋势呈折线状:

JDK的命令行工具解析

 

程序运行后,在“内存”页签中可以看到内存池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()方法外,调用就可以回收掉

全部内存。