JVM虚拟机---(5)虚拟机工具

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq1021979964/article/details/96482689

虚拟机工具

一、Jps(命令行)

Jps(Java Process Status)虚拟机进程,类似任务管理器

jps命令格式:

jps [ options ] [ hostid ]

第一行的10256是本地虚拟机的唯一ID

第二行及之后的是显示线程ID和类全名

jps工具主要选项

选    项

作            用

-q

只输出LVMID,省略主类的名称

-m

输出虚拟机进程启动时传递给主类main()函数的参数

-l  

输出主类的全名,如果进程执行的是jar包,输出jar包路径

-v

输出虚拟机进程启动时的JVM参数

J

二、stat(命令行)

Jstat(JVM Statistics Monitoring Tool)使用于监控虚拟机各种运行状态信息的命令行工具,可以监控本地或远程(需要远程主机提供RMI支持)虚拟机进程中的类装载信息、内存、垃圾收集、jit编译等运行数据。

 

jstat命令格式

jstat [ option vmid [ interval [ s | ms ] [ count ] ] ]

这个VMID,对于本地虚拟机进程而言,VMID和LVMID是一致的。参数interval和count分别表示查询间隔和次数,如果省略这两个参数,说明只查询一次,假设需要每100毫秒查询一次进程13204的垃圾收集情况,一共查询10次,那命令应当是:

jstat -gc 13204 100 10

监控虚拟机一次空间使用占比:

S0、S1:新生代的2个Survivor区。

E:新生代的Eden区。

O:老年代。

M:元空间。

CCS:压缩类的空间。

YGC:新生代的GC收集次数。

YGCT:新生代GC耗时。

FGC:老年代的GC收集次数。

FGCT:老年代GC耗时。

GCT:所有GC收集的总耗时。

 

jstat主要工具选项

选项

作用

-class

监视类装载、卸载数量、总空间以及类装载所耗费的时间

-gc

监视Java堆状况,包括Eden区、两个Survivor区、、老年代、永久带等的容量、已用空间、GC时间合计等信息

-gccapacity

监视内容基本与-gc相同,但输出主要关注Java堆各个区域使用到的最大、最小空间

-gcutil

监视内容基本与-gc相同,但输出主要关注已使用的空间占总空间的百分比

-gccause

-gcutil功能一样,但是会额外输出导致上一次GC产生的原因

-gcnew

监视新生代GC状况

-gcnewcapacity

监视内容基本与-gcnew相同,但输出主要关注使用到的最大、最小空间

-gcold

监视老年代GC状况

-gcoldcapacity

监视内容基本与-gcold相同,但输出主要关注使用到的最大、最小空间

-gcpermcapacity

输出永久代使用到的最大、最小空间

-compiler

输出JIT编译器编译过的方法、耗时等信息

-printcompilation

输出已经被JIT编译的方法

Jj

三、jinfo(命令行)

Jinfo(Configuration Info For Java)的作用是实时地查看和调整虚拟机各项参数,使用jps命令的-v可以查看虚拟机启动时显式指定的参数列表,但如果想知道未被显式指定的参数的系统默认值,可以使用jinfo的-flag选项进行查询,jinfo还可以使用sysprops选项把虚拟机进程的System.getProperties()的内容打印出来。

Jinfo命令格式

       Jinfo [option] pid

查看虚拟机有没有使用UseSerialGC

UseSerialGC前面有个-表示没有使用。如果是+号就是使用

-flag表示是否。

 

四、Jmap(命令行)

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

jmap的作用并不仅仅是为了获取dump文件,它还可以查询finalize执行队列、Java堆和永久代的详细信息,如空间使用率、当前使用的是哪种收集器等。和jinfo一样,jmap有不少功能在Windows平台下也是受限制的,除了生成dump文件的-dump选项和用于查看每个类的实例、空间占用统计的-histo选项在所有操作系统都提供之外,其余选项都只能在Linux和Solaris系统下使用。

jmap命令格式

jmap [ option ] vmid

生成Java堆转储快照到指定目录

 

jmap工具主要选项

选项

作用

-dump

生成Java堆转储快照。格式为-dump:[live, ]format=b,file=<filename>,其中live自参数说明是否只dump出存活的对象

-finalizerinfo

显示在F-Queue中等待Finalizer线程执行finalize方法的对象。只在LinuxSolaris系统下有效

-heap

显示Java堆详细信息,如使用哪种收集器、参数配置、分代状况等。只在LinuxSolaris系统下有效

-histo

显示堆中对象统计信息,包括类、实例数量、合计容量

-permstat

ClassLoader为统计口径显示永久代内存状态。只在LinuxSolaris系统下有效

-F

当虚拟机进行对-dump选项没有响应时,可使用这个选项强制生成dump快照。只在LinuxSolaris系统下有效

J

五、hat(命令行)

Jhat(JVM heap Analysis Tool)主要用来分析Java堆的命令,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等,并且支持对象查询语言。

使用jhat对之前转出的jmap的快照进行分析

分析完之后会启用一个7000端口的页面展示

但是cpu,内存的占用会比较大,意义不大

 

六、Jstack(命令行)

Jstack(Stack Trace for Java)命令用于生成虚拟机当前时刻的线程快照。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的目的主要是定位线程长时间出现停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等都是导致线程长时间停顿的原因。

线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做些什么事情,或者在等待些什么资源。

 

jstack命令格式

jstack [ option ] vmid

查看线程的状态,锁的信息等

jstack主要工具选项

选项

作用

-F

当正常输出的请求不被响应时,强制输出线程堆栈

-l

除堆栈外,显示关于锁的附加信息

-m

如果调用到本地方法的时候,可以显示C/C++的堆栈

七、Jconsole监控(可视化)

Jconsole是一个内置的Java性能分析器,可以从命令行(直接输入jconsole)或者在jdk\bin目录下双击打开jconsole.exe运行。它用于对JVM中内存,线程和类等的监控,可使用Jtop插件,可以监控本地的jvm,也可以监控远程的jvm,也可以同时监控多个jvm。

       Jconsole监控的信息:

  1. 概述:jvm概述和一些监控变量的信息。
  2. 内存:内存的使用信息。
  3. 线程:线程的使用信息。
  4. 类:加载java类的信息。
  5. VM:JVM摘要。
  6. MBeans:所有MBeans的信息。

 

1.测试内存监控

监控执行的程序

package com.kevin.jvm.utils;



import java.util.ArrayList;

import java.util.List;



/**

 * @author caonanqing

 * @version 1.0

 * @description     演示JConsole虚拟机工具对内存的监控

 * @createDate 2019/7/19

 */

public class JConsoleUtil {



    public byte[] b1 = new byte[128 * 1024];



    public static void main(String[] args) {

        try {

            Thread.sleep(5000);

        } catch (InterruptedException e) {

            e.printStackTrace();

        }

        System.out.println("start...");

        fill(1000);

    }



    private static void fill(int n) {

        List<JConsoleUtil> list = new ArrayList<>();



        for (int i = 0; i < n; i++) {

            try {

                Thread.sleep(100);

            } catch (InterruptedException e) {

                e.printStackTrace();

            }

            list.add(new JConsoleUtil());

        }

    }

}

2.测试线程监控

监控执行的程序

package com.kevin.jvm.utils;



import java.util.Scanner;



/**

 * @author caonanqing

 * @version 1.0

 * @description     演示JConsole虚拟机工具对线程的监控

 * @createDate 2019/7/19

 */

public class JConsoleUtil2 {



    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        sc.next();



        // 创建一个线程启动并处于等待期间

        new Thread(new Runnable() {

            @Override

            public void run() {

                while (true) {



                }

            }

        },"WhileTrue").start();

        sc.next();

        testWait(new Object());

    }



    private static void testWait(Object obj) {

        new Thread(new Runnable() {

            @Override

            public void run() {

                synchronized (obj) {

                    try {

                        obj.wait();

                    } catch (InterruptedException e) {

                        e.printStackTrace();

                    }

                }

                System.out.println();

            }

        },"Wait").start();

    }

}

 

 

3.测试线程死锁

package com.kevin.jvm.utils;



/**

 * @author caonanqing

 * @version 1.0

 * @description    演示JConsole虚拟机工具对线程死锁监控

 * @createDate 2019/7/19

 */

public class JConsoleUtil3 {



    public static void main(String[] args) {



        Object obj1 = new Object();

        Object obj2 = new Object();



        new Thread(new DeadLock(obj1,obj2)).start();

        new Thread(new DeadLock(obj2,obj1)).start();



    }

}
package com.kevin.jvm.utils;



/**

 * @author caonanqing

 * @version 1.0

 * @description         线程死锁监控

 * @createDate 2019/7/19

 */

public class JConsoleUtil3 {



    public static void main(String[] args) {



        Object obj1 = new Object();

        Object obj2 = new Object();



        new Thread(new DeadLock(obj1,obj2)).start();

        new Thread(new DeadLock(obj2,obj1)).start();



    }

}

 

八、Visual VM(可视化)

下载地址

首页地址: https://visualvm.github.io/index.html

插件地址: https://visualvm.github.io/pluginscenters.html

也可以使用JDK的bin自带的jvisualvm.exe

VisualVM是一个以监控、显示本地或者远程服务器JVM工作情况,进行性能调优的工具,借助VisualVM,可以实现对JVM内存池、CPU、垃圾收集器等方面进行监控、从而发现程序代码中潜在的泄露点和配置问题。

VisualVM使用各种技术监控许多供应商在java中运行的应用程序并对其进行故障排除。

特征

  1. 显示本地和远程Java进程。
  2. 显示流程配置和环境。
  3. 监控流程性能和内存。
  4. 可视化流程线程。
  5. 配置文件性能和内存使用。
  6. 采用并显示线程转储。
  7. 采取并浏览转储。
  8. 分析核心转储。
  9. 离线分析应用程序。

 

猜你喜欢

转载自blog.csdn.net/qq1021979964/article/details/96482689