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
下面,我们通过如下代码,演示堆内存溢出异常:
package com.ys.algorithmproject.leetcode.demo.JVM; import java.util.ArrayList;
import java.util.List; /**
* Create by YSOcean
*
*/
public class JmapTest {
private static final int _1MB = 1024*1024; /**
* 虚拟机参数设置: -Xms20M -Xmx20M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./
* @param args
*/
public static void main(String[] args) {
List<Object> list = new ArrayList<>();
while(true){
list.add(new Object[_1MB]);
}
}
}
设置虚拟机参数后,然后运行这段代码,就会发生堆内存溢出异常,并在根目录下生成快照文件 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
Java虚拟机详解(七)------虚拟机监控和分析工具(1)——命令行的更多相关文章
- Java集合详解及List源码分析
对于数组我们应该很熟悉,一个数组在内存中总是一块连续的存储空间,数组的创建使用new关键字,数组是引用类型的数据,一旦第一个元素的位置确定,那么后面的元素位置也就确定了,数组有一个最大的局限就是数组一 ...
- Java虚拟机详解----JVM常见问题总结
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- 「万字图文」史上最姨母级Java继承详解
摘要:继承是面向对象软件技术中的一个概念.它使得复用以前的代码非常容易,能够大大缩短开发周期,降低开发费用. 本文分享自华为云社区<「万字图文」史上最姨母级Java继承详解丨[奔跑吧!JAVA] ...
- C++调用JAVA方法详解
C++调用JAVA方法详解 博客分类: 本文主要参考http://tech.ccidnet.com/art/1081/20050413/237901_1.html 上的文章. C++ ...
- Java ClassLoad详解
Java ClassLoad详解 类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一.它使得 Java 类可以被动态加载到 Java 虚拟机中并执行.类加载器从 JDK 1. ...
- java关键字(详解)
目录 1. 基本类型 1) boolean 布尔型 2) byte 字节型 3) char 字符型 4) double 双精度 5) float 浮点 6) int 整型 7) long 长整型 8) ...
- java对象详解
java对象及线程详解 内存布局 普通对象布局 数组的内存布局 内部类的内存布局 对象分解 对象头-mark word(8字节) 实例数据 对齐填充(可选) java锁分析 volatile关键字 v ...
- Java ClassLoader详解(转载)
Java ClassLoader详解 类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一.它使得 Java 类可以被动态加载到 Java 虚拟机中并执行.类加载器从 JDK ...
- Java 正则表达式详解_正则表达式
body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...
随机推荐
- JS浅学
(变量的名字.focus(); )让打开的新的页面获取焦点 (变量的名字.close();)关闭打开的页面 可以用(!变量名)直接判断是否打开过新的页面 用(变量名.closed)判断是不是被关闭了 ...
- cron 表达式的格式 了解
cron 表达式的格式 Quartz cron 表达式的格式十分类似于 UNIX cron 格式,但还是有少许明显的区别.区别之一就是 Quartz 的格式向下支持到秒级别的计划,而 UNIX cro ...
- nginx目录穿越漏洞复现
nginx目录穿越漏洞复现 一.漏洞描述 Nginx在配置别名(Alias)的时候,如果忘记加/,将造成一个目录穿越漏洞. 二.漏洞原理 1. 修改nginx.conf,在如下图位置添加如下配置 在如 ...
- 将个人网站主页设置为Tomcat默认打开页面
步骤: 1.打开server.xml,在</Host>的上一行添加内容格式如下 <Context path="" reloadable="true&qu ...
- java反射原理及Class应用
反射:框架设计灵魂 框架:半成品软件,可以在框架基础上进行软件开发,简化编码 反射:将类的各个组成部分封装我其他对象,这就是反射机制 好处: 1.可以在程序运行过程中,操作这些对象 2.可以解耦, ...
- mybatis01-1测试
首先需要数据源信息和日志文件 然后一个SQLMapConfig.xml配置文件连接数据库并且映射后一个xml文件,另一个xml文件写入SQL语句, 最后text测试文件读取第一个配置文件,放到SQLS ...
- Linux 常用命令及使用方法
1. type :查询命令 是否属于shell解释器 2. help : 帮助命令3. man : 为所有用户提供在线帮助4. ls : 列表显示目录内的文件及目录 -l 以长格 ...
- Spring的依赖注入和管理Bean
采用Spring管理Bean和依赖注入 1.实例化spring容器 和 从容器获取Bean对象 实例化Spring容器常用的两种方式: 方法一: 在类路径下寻找配置文件来实例化容器 [推荐使用] Ap ...
- 深入理解JVM-java字节码文件结构剖析(1)
public class MyTest1 { private int a = 1; public int getA() { return a; } public void setA(int a) { ...
- 理解分布式一致性与Raft算法
理解分布式一致性与Raft算法 永远绕不开的CAP定理 出于可用性及负载方面考虑,一个分布式系统中数据必然不会只存在于一台机器,一致性简单地说就是分布式系统中的各个部分保持数据一致 但让数据保持一致往 ...