美文网首页
JDK监控和故障处理工具总结

JDK监控和故障处理工具总结

作者: Change_6556 | 来源:发表于2019-10-25 16:10 被阅读0次

    JDK命令行工具

    jps:查看所有Java进程

    jps -l :输出主类的全名 及 进程ID

    jstat:监视虚拟机各种运行状态信息

    jstat -class vmid 显示ClassLoader的相关信息
    jstat -gc vmid 显示GC相关的堆信息
    jstat -gcnew vmid 显示新生代信息
    jstat -gcnewcapcacity 显示新生代大小和使用情况

    jinfo:实时地查看和调整虚拟机各项参数

    jinfo vmid :输出当前 jvm 进程的全部参数和系统属性 (第一部分是系统的属性,第二部分是 JVM 的参数)。
    jinfo -flag name vmid 输出对应名称的参数具体值,比如输出MaxHeapSize,查看当前JVM进程是否开启打印GC日志( -XX:PrintGCDetails :详细 GC 日志模式,这两个都是默认关闭的)。
    ...
    C:\Users\SnailClimb>jinfo -flag MaxHeapSize 17340
    -XX:MaxHeapSize=2124414976
    C:\Users\SnailClimb>jinfo -flag PrintGC 17340
    -XX:-PrintGC
    ...
    使用 jinfo 可以在不重启虚拟机的情况下,可以动态的修改 jvm 的参数。尤其在线上的环境特别有用,请看下面的例子:
    ...
    C:\Users\SnailClimb>jinfo -flag PrintGC 17340
    -XX:-PrintGC

    C:\Users\SnailClimb>jinfo -flag +PrintGC 17340

    C:\Users\SnailClimb>jinfo -flag PrintGC 17340
    -XX:+PrintGC
    ...
    jinfo -flag [+|-]name vmid 开启或者关闭对应名称的参数。

    jmap:生成堆转储快照

    jmap(Memory Map for Java)命令用于生成堆转储快照。 如果不使用 jmap 命令,要想获取 Java 堆转储,可以使用 “-XX:+HeapDumpOnOutOfMemoryError” 参数,可以让虚拟机在 OOM 异常出现之后自动生成 dump 文件,Linux 命令下可以通过 kill -3 发送进程退出信号也能拿到 dump 文件。

    jmap 的作用并不仅仅是为了获取 dump 文件,它还可以查询 finalizer 执行队列、Java 堆和永久代的详细信息,如空间使用率、当前使用的是哪种收集器等。和jinfo一样,jmap有不少功能在 Windows 平台下也是受限制的。
    ...
    C:\Users\SnailClimb>jmap -dump:format=b,file=C:\Users\SnailClimb\Desktop\heap.hprof 17340
    Dumping heap to C:\Users\SnailClimb\Desktop\heap.hprof ...
    Heap dump file created
    ...
    示例:将指定应用程序的堆快照输出到桌面。后面,可以通过 jhat、Visual VM 等工具分析该堆文件。

    jhat : 分析heapdump文件

    jhat 用于分析 heapdump 文件,它会建立一个 HTTP/HTML 服务器,让用户可以在浏览器上查看分析结果。
    ...
    C:\Users\SnailClimb>jhat C:\Users\SnailClimb\Desktop\heap.hprof
    Reading from C:\Users\SnailClimb\Desktop\heap.hprof...
    Dump file created Sat May 04 12:30:31 CST 2019
    Snapshot read, resolving...
    Resolving 131419 objects...
    Chasing references, expect 26 dots..........................
    Eliminating duplicate references..........................
    Snapshot resolved.
    Started HTTP server on port 7000
    Server is ready.
    ...

    jstack:生成虚拟机当前时刻的线程快照

    jstack(Stack Trace for Java)命令用于生成虚拟机当前时刻的线程快照。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合.
    生成线程快照的目的主要是定位线程长时间出现停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等都是导致线程长时间停顿的原因。线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做些什么事情,或者在等待些什么资源。
    下面是一个线程死锁的代码。我们下面会通过 jstack 命令进行死锁检查,输出死锁信息,找到发生死锁的线程。
    ...
    public class DeadLockDemo {
    private static Object resource1 = new Object();//资源 1
    private static Object resource2 = new Object();//资源 2

    public static void main(String[] args) {
        new Thread(() -> {
            synchronized (resource1) {
                System.out.println(Thread.currentThread() + "get resource1");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread() + "waiting get resource2");
                synchronized (resource2) {
                    System.out.println(Thread.currentThread() + "get resource2");
                }
            }
        }, "线程 1").start();
    
        new Thread(() -> {
            synchronized (resource2) {
                System.out.println(Thread.currentThread() + "get resource2");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread() + "waiting get resource1");
                synchronized (resource1) {
                    System.out.println(Thread.currentThread() + "get resource1");
                }
            }
        }, "线程 2").start();
    }
    

    }
    ...
    jstack 命令
    ...
    C:\Users\SnailClimb>jps
    13792 KotlinCompileDaemon
    7360 NettyClient2
    17396
    7972 Launcher
    8932 Launcher
    9256 DeadLockDemo
    10764 Jps
    17340 NettyServer
    C:\Users\SnailClimb>jstack 9256
    ...
    结果
    ...
    Found one Java-level deadlock:
    =============================
    "线程 2":
    waiting to lock monitor 0x000000000333e668 (object 0x00000000d5efe1c0, a java.lang.Object),
    which is held by "线程 1"
    "线程 1":
    waiting to lock monitor 0x000000000333be88 (object 0x00000000d5efe1d0, a java.lang.Object),
    which is held by "线程 2"

    Java stack information for the threads listed above:
    ...
    ===================================================
    "线程 2":
    at DeadLockDemo.lambdamain1(DeadLockDemo.java:31)
    - waiting to lock <0x00000000d5efe1c0> (a java.lang.Object)
    - locked <0x00000000d5efe1d0> (a java.lang.Object)
    at DeadLockDemoLambda$2/1078694789.run(Unknown Source) at java.lang.Thread.run(Thread.java:748) "线程 1": at DeadLockDemo.lambda$main$0(DeadLockDemo.java:16) - waiting to lock <0x00000000d5efe1d0> (a java.lang.Object) - locked <0x00000000d5efe1c0> (a java.lang.Object) at DeadLockDemoLambda$1/1324119927.run(Unknown Source)
    at java.lang.Thread.run(Thread.java:748)

    Found 1 deadlock.
    ...

    JDK可视化分析工具

    JConsole:Java监视与管理控制台

    JConsole 是基于 JMX 的可视化监视、管理工具。可以很方便的监视本地及远程服务器的 java 进程的内存使用情况。你可以在控制台输出console命令启动或者在 JDK 目录下的 bin 目录找到jconsole.exe然后双击启动。

    Visual VM:多合一故障处理工具

    VisualVM 提供在 Java 虚拟机 (Java Virutal Machine, JVM) 上运行的 Java 应用程序的详细信息。在 VisualVM 的图形用户界面中,您可以方便、快捷地查看多个 Java 应用程序的相关信息。Visual VM 官网:https://visualvm.github.io/ 。Visual VM 中文文档:https://visualvm.github.io/documentation.html

    相关文章

      网友评论

          本文标题:JDK监控和故障处理工具总结

          本文链接:https://www.haomeiwen.com/subject/snyxvctx.html