Bootstrap

Java虚拟机性能监测工具

虚拟机内存分析常用命令

jps [options] [hostid]

  1. options:命令选项,用来对输出格式进行控制,jps命令选项如下:
    -q 不输出类名、Jar名和传入main方法的参数
    -m 输出传入main方法的参数
    -l 输出main类或Jar的全限名
    -v 输出传入JVM的参数
  2. hostid:指定监控主机,默认为当前主机

为了便于观察正在运行的先把tomcat启动起来

  • JpsDemo类,并运行起来
public class JpsDemo {
    public static void main(String[] args) {
        int i=0;
        while (true) {
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(i);
            i++;
        }
    }
}
  1. jps -l
    结果

  2. jps -m
    在这里插入图片描述

  3. jps -v
    结果

  4. jps -q
    在这里插入图片描述


jmap [option]

  1. option:命令选项,常用选项如下:
    -heap 打印Java堆概要信息,包括使用的GC算法、堆配置参数和各代中堆内存使用情况
    结果


    -histo[:live] 打印Java堆中对象直方图,通过该图可以获取每个class的对象数目,占用内存大小和类全名信息,带上:live,则只统计活着的对象
    结果

-finalizerinfo 打印等待回收的对象信息,如下命令:
jmap -finalizerinfo 5352
结果
暂时没有待会收的对象

2 -dump:<dump-options> 以hprof二进制格式将Java堆信息输出到文件内,该文件可以用MAT、VisualVM或jhat等工具查看

  • dump-options命令选项:
    -live 只输出活着的对象;不指定,则输出堆中所有对象
    -format=b 指定输出格式为二进制
    - file=<file> 指定文件名及文件存储位置
    例如:jmap -dump:live,format=b,file=D:\heapInfo.bin\ <pid>

    -F 与-dump:<dump-options> <pid>或-histo<pid>一起使用,当<pid>没有响应时,强制执行;注意:不支持live子选项
    在这里插入图片描述
    生成的二进制文件
    结果


jhat

用于分析产生的堆文件,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持对象查询语言。

  1. 导出堆文件:
    jmap -dump:live,file=D:\heap.log pid
    上面文件已经生成
  2. 分析堆文件:
    jhat -J-Xmx512m <heap dump file>解析Java堆转储文件,并启动一个 web server;
    说明:有时dump出来的堆文件很大,在启动时报堆空间不足的错误,可添加-J-Xmx512M参数
    jhat -J-Xmx512M D:\heapInfo.bin
    结果
    3、查看html:在浏览器中输入主机地址,端口号会在上一步的操作中显示出来(一般为127.0.0.1:7000)。
    结果
  • 红框中为较为常用的选项
  • 其中的Show heap histogram和jmap -histo <pid> 命令显示的信息一样

Show instance counts for all classes (excluding platform)选项为例:
结果

  • 说明:
    All classes including platform 显示所有创建堆中对象的类
    Show all members of the rootset 显示rootset能引用到的所有对象
    Show instance counts for all classes (including platform) 显示所有类(包括JDK中定义的Java类)的实例数量
    Show instance counts for all classes (excluding platform) 显示所有类(不包括JDK中定义的Java类)的实例数量
    Show heap histogram 显示堆内对象直方图
    Show finalizer summary 显示等待回收的对象信息
    Execute Object Query Language (OQL) query 执行对象查询语句

除jmap命令外,还可以通过以下方式获取堆文件:
1、使用 jconsole 选项通过HotSpotDiagnosticMXBean从运行时获得堆转储(生成dump文件)
2、JVM启动时如果指定了-XX:+HeapDumpOnOutOfMemoryError选项, 则在抛出 OutOfMemoryError异常时, 会自动执行堆转储。


jstack

用于显示指定进程内线程的信息
语法: jstack [option] <pid>

  • 说明:
    option:命令选项,常用选项如下:
    -F当’jstack [-l] pid’没有相应的时候强制打印栈信息,如果直接jstack无响应时,用于强制jstack),一般情况不需要使用
    -l 长列表. 打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表,会使得JVM停顿得长久得多(可能会差很多倍,比如普通的jstack可能几毫秒和一次GC没区别,加了-l 就是近一秒的时间),-l 建议不要用。一般情况不需要使用
    -m 打印java和native c/c++框架的所有栈信息.可以打印JVM的堆栈,显示上Native的栈帧,一般应用排查不需要使用
    pid:进程id

常用命令演示

结果


jstat

  • Java Virtual Machine statistics monitoring tool(jstat)用于查看堆内存各部分的使用量及加载类的数量

  • 语法:
    jstat -<option> [-t] [-h<lines>] <vmid> [<interval[s|ms]> [<count>]]

  • 说明:
    option:命令选项,通过jstat -options可以查看jstat支持哪些命令选项

      -class 统计加载class的数量及其所占空间大小等信息
      -compiler 统计HotSpot实时编译的数量等信息
      -gc 统计gc信息,包括young gc次数、young gc时间、full gc次数、full gc时间和gc总时间
      -gccapacity 统计gc时,不同generations内存大小
      -gccause 统计gc时,最近一次GC的信息(等效于-gcutil)和引起gc原因
      -gcpermcapacity 统计gc时,permanent区大小(JDK7及其以前版本)
      -gcmetacapacity 统计gc时,metaspace区大小(JDK8及其以后版本)
      -gcnew 统计gc时,新生代内对象的信息
      -gcnewcapacity 统计gc时,新生代大小
      -gcold 统计gc时,老年代内对象的信息
      -gcoldcapacity 统计gc时,老年代大小
      -gcutil 统计gc时,最近一次GC的信息
      -printcompilation hotspot编译方法统计
    

-t :timestamp简写,
-h<lines> :h是显示标题,lines代表一个整数,-h3表示每三行显示一次标题
vmid:VM进程号,即当前运行的Java进程号
interval:间隔多长时间统计一次,默认单位ms(毫秒),如果为s,则为秒
count:统计次数,如果省略,则统计无限次,但interval和count都省略,则只统计一次

  • 以gc命令为例:
    jstat -gc 2568 250 6
    结果

jvisualvm(图形化界面)

在这里插入图片描述

  • 工具—>插件,在可用插件中安装visual GC这个插件,重启visualvm之后
    在这里插入图片描述
    结果
;