Java命令行监控工具(jmap,jstack,jstat,jinfo,jps)

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

jps

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


image.png

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

官方jps解释:https://docs.oracle.com/javase/7/docs/technotes/tools/share/jps.html

jstat

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


image.png

解释下-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解释:https://docs.oracle.com/javase/7/docs/technotes/tools/share/jstat.html

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已经帮我们找到了死锁。


image.png

image.png

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

image.png

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


image.png

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


image.png

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

jstack官方文档解释

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

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

直接使用jinfo

  1. 前半段是系统的属性


    image.png
  1. 后半段是jvm的参数


    image.png

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


image.png

jinfo官方解释

jmap分析堆

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

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

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

演示内存溢出

堆内存溢出代码

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

运行:


image.png

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

在线分析hprof文件:
http://heaphero.io/

image.png

image.png

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

image.png

jmap官方解释

最后

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容