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

分析结果显示:

http://localhost:7000/

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()方法外,调用就可以回收掉

全部内存。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

独行客-编码爱好者

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

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

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

打赏作者

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

抵扣说明:

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

余额充值