博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java命令行监控工具(jmap,jstack,jstat,jinfo,jps)
阅读量:6377 次
发布时间:2019-06-23

本文共 3179 字,大约阅读时间需要 10 分钟。

项目部署上线之后,线上项目是不能轻易修改的,定位问题的难度也会变大。因此监控是非常重要的一个环节,有了监控,我们才能更好的定位系统中的问题,从而排查。监控的工具有很多种, 但是java自带的命令行监控工具,是必须要掌握的。

jps

查看系统中jvm进程, 其它的命令通常先使用jps查看进程号,然后在根据线程号获取jvm进程信息

jps -m 查看jvm进程并且带有参数查看 jps -v 查看传递到jvm的参数

官方jps解释:

jstat

显示JVM的性能统计信息, 常见用法:jstat - [-t] [-h] [ []] 例如:查看JIT编译信息,GC信息和JVM中的class信息。

解释下-gc选项中列的含义:-gc查看垃圾收集器中的信息, 主要包含jvm的运行时数据区统计。 后缀为C的代表当前区的容量,后缀为U的代表已经使用了多少容量,后缀为T的代表耗时

S0C 存活区0的容量(KB) S1C 存活区1的容量(KB) S0U 存活区0使用的空间 (KB). S1U 存活区1的利用空间 (KB). EC Eden区的容量(KB). EU Eden区利用的容量(KB). OC 老年代容量(KB). OU 老年代使用容量(KB). PC 当前永久带的容量(KB). PU 永久带使用容量(KB). YGC 发生了多少次Young GC YGCT Young GC的时间 FGC Full GC的次数 FGCT Full GC的收集时间 GCT 总共的GC时间.

官方jstat解释:

jstack

查看线程堆栈信息,在发生死锁的时候可以利用这个命令查找死锁或者在发生死循环的时候利用此命令排查。

jstack vmpid 会打印线程的堆栈信息。通过堆栈可以查看具体线程正在执行那些代码,厦门演示两个使用jstack排查死锁与死循环的命令。

死锁代码:

public class DeadLock {    private static Object o1 = new Object();    private static Object o2 = new Object();    private static CountDownLatch countDownLatch = new CountDownLatch(2);    public static void main(String[] args) throws InterruptedException {        new Thread(){            @Override            public void run() {                synchronized (o1){                    try {                        Thread.sleep(100);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                    System.out.println("线程1 获得锁1");                    synchronized (o2){                        System.out.println("线程1 获得锁2");                        countDownLatch.countDown();                    }                }            }        }.start();        new Thread(){            @Override            public void run() {                synchronized (o2){                    try {                        Thread.sleep(100);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                    System.out.println("线程2 获得锁2");                    synchronized (o1){                        System.out.println("线程2 获得锁1");                        countDownLatch.countDown();                    }                }            }        }.start();        countDownLatch.await();        System.out.println("执行完毕");            }}复制代码

死锁之后: 可以看到jstack已经帮我们找到了死锁。

死循环需要配合Top命令一起使用,死循环会导致CPU不断的飙升,这时候使用top命令,查看cpu占用率较高的命令:

使用top -H -p 24278 查看进程中具体是那一条线程的CPU利用率高

可以看到是24279的线程,在top中使用的是10进制,在jstack中打印的线程是16进制,因此做一次转换。 24279 => 5ed7 然后查看线程:

然后我们可以知道具体那一行的指令在一直运行。

jinfo查看JVM启动时候设置的参数值

jinfo可以查看当前JVM线程配置的系统属性,以及运行时设置的参数值。

直接使用jinfo

  1. 前半段是系统的属性

  2. 后半段是jvm的参数

我们也可以直接使用jinfo查看具体的某个参数值:

jmap分析堆

在发生OME的时候,会用jmap分析堆中具体是什么问题,才能更好的解决问题。jmap一般和mat配合使用。

一般在java开发的项目启动时候,最好加上下面命令,在内存溢出的时候可以通过日志查看信息。 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/java/dump

当然在项目运行的时候也可以使用jmap -heap jvmpid查看对象内存的映射。

演示内存溢出

堆内存溢出代码

public class DealCycle {    public static LinkedList
linkedList = new LinkedList<>(); public static void main(String[] args) { int i = 0; while (true){ linkedList.add(i); } }}复制代码

运行:

大家可以去网站上下载java mat的二进制压缩包,学习一下

在线分析hprof文件:

如果每次都等到内存溢出才导出文件时间就有些晚了,可以使用jmap直接导出

最后

这篇文章主要介绍了java自带的命令行工具,通过这些命令行工具,我们可以很好的得知当前jvm的运行状态。

转载地址:http://dzxqa.baihongyu.com/

你可能感兴趣的文章
RHEL6.3实现基于加密的用户认证验证访问
查看>>
SCCM2012 R2实战系列之十一:解决OSD分发Windows7 系统盘盘符为’D’问题
查看>>
经验分享:我是如何在网店无货源情况下快速出单?
查看>>
当AD服务器置于防火墙内时,所需开放的端口
查看>>
限免的Mac App套件,工程师绝对不可错过
查看>>
Exchange 2013 添加地址列表到脱机通讯簿
查看>>
Skype for Business Server 2015-05-监控和存档服务器-配置
查看>>
浅谈物化视图
查看>>
安装SQL Server 2017
查看>>
超融合超越企业传统存储绕不开的六个问题
查看>>
医院CIO的一幅工作对联
查看>>
DPM灾难切换应用场景
查看>>
简单配置Oracle10g DataGuard物理备库
查看>>
网曝支付宝漏洞:手机丢了,支付宝也就完了
查看>>
4 在vCenter Server安装View Composer组件
查看>>
SFB 项目经验-24-为持久聊天室-查询或者增加成员
查看>>
Linux下配置Squid基础教程
查看>>
当Cacti遭遇大流量
查看>>
Outlook Anywhere 客户端配置详解
查看>>
《Windows Server 2008 R2系统管理实战》前言与内容提要
查看>>