专栏首页IT可乐Java虚拟机详解(七)------虚拟机监控和分析工具(1)——命令行

Java虚拟机详解(七)------虚拟机监控和分析工具(1)——命令行

  通过前面的几篇博客,我们介绍了Java虚拟机的内存分配以及内存回收等理论知识,了解这些知识对于我们在实际生产环境中提高系统的运行效率是有很大的帮助的。但是话又说回来,在实际生产环境中,线上项目正在运行,我们怎么去监控虚拟机运行效率?又或者线上项目发生了OOM,异常堆栈信息,我们又怎么去抓取,然后怎么去分析定位问题呢?

  本篇博客,我们就来介绍各种虚拟机监控和分析工具,当然都是命令行工具,不够直观,下篇博客我们会介绍各种可视化工具。

1、jps:显示虚拟机进程

JVM Process Status Tools ,显示指定系统内所有的 HotSpot 虚拟机进程。

  该命令有如下常用参数:

  ①、-l

  显示应用程序main类的完整包名称或应用程序的JAR文件的完整路径名。

  ②、-v

  显示虚拟机启动时的JVM参数。

  ③、-m

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

  比如,我在服务器上启动了一个Tomcat,如下:

  然后,输入 jps 命令,打印信息如下:

  这里的 Bootstrap 便是启动的 Tomcat进程。可以加上 -v 参数,显示所有传递给 JVM的参数信息。

  PS:jps 命令默认是没有安装的,需要进行安装,具体安装步骤可以百度,我这里就不做详细介绍了。

  jps更多详细信息,请参考官方文档:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jps.html

2、jstat:统计监视虚拟机信息工具

JVM Statistics Monitoring Tool,用于收集虚拟机各方面的运行数据。

  jstat 是用于监视虚拟机各种运行时状态信息的命令行工具。它可以显示本地或远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行时数据,它是运行时期定位虚拟机性能问题的首选工具。但是终究只是命令行工具,后面我们会介绍图形化工具,更加直观。

  该命令监控本地的格式如下:

jstat -参数 vmid 采样间隔时间 采样次数

  ①、常用参数有如下

  ②、vmid

  表示目标虚拟机的标识符,在Linux系统上可以通过上小节我们介绍的 jps 命令,前面输出的数字便是进程 PID。在windows平台上,可以通过任务管理器查看。

  ③、采样间隔时间

  默认单位是毫毛,必须是正整数。

实例1:这里我们加入 -class 参数,查看类装载信息:

  相关表头信息:

  Loaded:加载的类数量。

  Bytes:加载的类字节KB大小。

  Unloaded:卸载的类数量。

  Bytes:卸载的类字节KB大小。

  Time:执行类加载和卸载操作所花费的时间。

  jstat更多详细信息,请参考官方文档:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html

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

jinfo(Confiiguration Info for Java):实时的查看和调整虚拟机各项参数

  jinfo ,通过此命令,我们可以实时的查看和调整虚拟机的各项参数(包括显示指定或默认配置的)。

  该命令格式如下:

  jinfo [ 选项 ] pid

  ①、常用选项如下

  一、没有选项

  打印系统属性名称键值对。

  二、-参数名称

  打印指定参数的名称和值。

  三、-flag [+|-] 参数名称

  启用或者禁用指定的布尔命令。

  四、-flag name=value

  设置参数name的值为value

  五、-sysprops

  打印Java属性名称键值对。

  ②、pid

  进程号,和上面一样,可以通过jps命令获取。

   jinfo更多详细信息,请参考官方文档:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jinfo.html

4、jmap:内存映像工具

jmap(Memory Map for Java):用于生成堆存储快照

  jmap主要用于获取堆存储快照文件,在生产环境中,发生OOM(堆内存溢出)异常时,我们可以通过这个快照文件来快速定位到具体代码位置。

  这个命令还可以查询 finalize 队列,Java堆和永久代信息,如空间使用率、当前用的是哪种垃圾收集器等。

  该命令格式如下:

  jmap [参数] pid

  ①、常用参数如下:

  对于堆内存溢出异常,在前面介绍虚拟机参数时,我们介绍过,通过下面两个参数,也能够打印堆内存快照。

  -XX:+HeapDumpOnOutOfMemoryError

  -XX:HeapDumpPath

  下面,我们通过如下代码,演示堆内存溢出异常:

 1 package com.ys.algorithmproject.leetcode.demo.JVM;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 
 6 /**
 7  * Create by YSOcean
 8  *
 9  */
10 public class JmapTest {
11     private static final int _1MB = 1024*1024;
12 
13     /**
14      * 虚拟机参数设置: -Xms20M -Xmx20M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./
15      * @param args
16      */
17     public static void main(String[] args) {
18         List<Object> list = new ArrayList<>();
19         while(true){
20             list.add(new Object[_1MB]);
21         }
22     }
23 }

  设置虚拟机参数后,然后运行这段代码,就会发生堆内存溢出异常,并在根目录下生成快照文件 java_pid10840.hprof。

  那么,怎么通过 jmap 命令来生成堆内存快照呢?

jmap -dump:format=b,file=heap20190821.hprof  16823

  后面的数字是进程PID,可以通过jps命令来获取。

  得到堆内存快照了,那么我们怎么去查看呢?

  在eclipse中,可以下载 MAT 工具,而在 IDEA中,可以下载 JProfiler 插件。实在不行,可以用我们下篇博客介绍的几个可视化工具,具体情况见下篇博客。

  jmap更多详细信息,请参考官方文档:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jmap.html

5、jstack:Java堆栈跟踪工具

 Stack Trace for Java,用于生成虚拟机当前时刻的线程快照。

  线程快照其实就是当前虚拟机每一条线程正在执行的堆栈的集合,通过线程快照可以用来定位线程出现长时间停顿的原因(线程间死锁、死循环、请求外部资源导致的长时间等待)。

  该命令格式如下:

  jstack [选项] pid

  ①、常用选项如下:

参考文档:https://docs.oracle.com/javase/8/docs/technotes/tools/index.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java虚拟机详解(一)------简介

      本系列博客我们将以当前默认的主流虚拟机HotSpot 为例,详细介绍 Java虚拟机。以 JDK1.7 为主,同时介绍与 JDK1.8 的不同之处,通过Or...

    IT可乐
  • Java虚拟机详解(二)------运行时内存结构

      我们编写好的Java源代码程序,通过Java编译器javac编译成Java虚拟机识别的class文件(字节码文件),然后由 JVM 中的类加载器加载编译生成...

    IT可乐
  • Java虚拟机详解(六)------内存分配

      我们说Java是自动进行内存管理的,所谓自动化就是,不需要程序员操心,Java会自动进行内存分配和内存回收这两方面。

    IT可乐
  • 在Windows 10上使用Hyper-V创建VM

    如果您运行的是Windows 10并且您的系统硬件支持Hyper-V,那么你可以创建一个独立的存储空间来部署自己的虚拟机并使用它。您可以创建一个或多个虚拟机并同...

    用户1159036
  • 基于KVM的H3C云计算平台CAS的一些运维经验

    版权声明:本文为耕耘实录原创文章,各大自媒体平台同步更新。欢迎转载,转载请注明出处,谢谢

    耕耘实录
  • 通过设置双网卡实现VirtualBox虚机上网及主宿互访

    最近,经过一些研究,终于调通了VirtualBox虚拟机互连、主宿机互连、以及主宿机连接互联网。下面分享一下。

    大江小浪
  • 虚拟机又连不上网了?(亲测,一招鲜吃遍天)

    最近玩的虚拟机莫名其妙就连不上网了, 上网查了种种攻![在这里插入图片描述](http略,最后得出结论:我的虚拟机非常正常,网络畅通无阻,给我气半死。。。

    看、未来
  • 你应该知道的VirtualBox虚拟机网络配置

    用户2032165
  • Kali Linux安装到U盘

    虽然使用其他工具也能将Kali Linux安装到U盘,但是经测试,成功率很低。而且一般是刻录后还需要其他操作以避免刻录为Kali Linux安装盘。借助虚拟机将...

    周俊辉
  • vSphere初体验之新建虚拟机

    物理机:DELL  IPTIPLEX 990 PC机 I52400处理器支持VT功能  8G内存 千兆网卡

    三杯水Plus

扫码关注云+社区

领取腾讯云代金券