通过前面的几篇博客,我们介绍了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)——命令行的更多相关文章

  1. Java集合详解及List源码分析

    对于数组我们应该很熟悉,一个数组在内存中总是一块连续的存储空间,数组的创建使用new关键字,数组是引用类型的数据,一旦第一个元素的位置确定,那么后面的元素位置也就确定了,数组有一个最大的局限就是数组一 ...

  2. Java虚拟机详解----JVM常见问题总结

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  3. 「万字图文」史上最姨母级Java继承详解

    摘要:继承是面向对象软件技术中的一个概念.它使得复用以前的代码非常容易,能够大大缩短开发周期,降低开发费用. 本文分享自华为云社区<「万字图文」史上最姨母级Java继承详解丨[奔跑吧!JAVA] ...

  4. C++调用JAVA方法详解

    C++调用JAVA方法详解          博客分类: 本文主要参考http://tech.ccidnet.com/art/1081/20050413/237901_1.html 上的文章. C++ ...

  5. Java ClassLoad详解

    Java ClassLoad详解 类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一.它使得 Java 类可以被动态加载到 Java 虚拟机中并执行.类加载器从 JDK 1. ...

  6. java关键字(详解)

    目录 1. 基本类型 1) boolean 布尔型 2) byte 字节型 3) char 字符型 4) double 双精度 5) float 浮点 6) int 整型 7) long 长整型 8) ...

  7. java对象详解

    java对象及线程详解 内存布局 普通对象布局 数组的内存布局 内部类的内存布局 对象分解 对象头-mark word(8字节) 实例数据 对齐填充(可选) java锁分析 volatile关键字 v ...

  8. Java ClassLoader详解(转载)

    Java ClassLoader详解 类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一.它使得 Java 类可以被动态加载到 Java 虚拟机中并执行.类加载器从 JDK ...

  9. Java 正则表达式详解_正则表达式

    body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...

随机推荐

  1. iOS程序员如何提升核心竞争力,防止自己被裁员?

    前言: 核心竞争力最早由普拉哈拉德和加里·哈默尔两位教授提出,通常认为核心竞争力,即企业或个人相较于竞争对手而言所具备的竞争优势与核心能力差异,说白了就是你的优势,而且最好是独一无二的的优势,这就是核 ...

  2. Shiro权限管理框架(二):Shiro结合Redis实现分布式环境下的Session共享

    首发地址:https://www.guitu18.com/post/2019/07/28/44.html 本篇是Shiro系列第二篇,使用Shiro基于Redis实现分布式环境下的Session共享. ...

  3. Ubuntu下python安装mysqldb(驱动)

    最近在学习Django框架,需要使用到数据库,我使用的是mysql,跟java一样,需要安装驱动,这是驱动的下载网址http://sourceforge.net/projects/mysql-pyth ...

  4. __int64与long long、long的区别

    首先来看一看int.long.long long的取值范围 int                  所占字节数为:4                   表示范围为:-2147483648~2147 ...

  5. 【转载】【VSCode】Windows下VSCode编译调试c/c++

    转载自:http://blog.csdn.net/c_duoduo/article/details/51615381 懒得自己配置或自己配置出现不明问题的朋友可以点这里: [VSCode]Window ...

  6. Danjgo学习笔记(一)

    ## 创建项目: 1. 通过命令行的方式:首先要进入到安装了django的虚拟环境中.然后执行命令: ``` django-admin startproject [项目的名称] ``` 这样就可以在当 ...

  7. jmh源码解析-整体架构

    我理解的jmh运行架构图 生成字节码,字节码负责维护测试的状态和调用被测试的方法 默认在fork的进程中进行测试,可以配置多个fork进程,以减少误差 通过线程池,提交每个迭代的测试任务,任务执行后, ...

  8. 【0802 | Day 7】Python进阶(一)

    目 录  数字类型的内置方法 一.整型内置方法(int) 二.浮点型内置方法(float) 字符串类型内置方法 一.字符串类型内置方法(str) 二.常用操作和内置方法 优先掌握: 1.索引取值 2. ...

  9. azure k8s netcore 程序初次部署

    以下都是我在2018年12月份做的实验,今天才发布出来. 念想 首先是了解一些关于K8s的一些基础概念,推荐查看一下这个链接,非常适合入门k8s.是因为K8S的环境搭建比较复杂(最主要是懒),其实也有 ...

  10. 物流运输trans「ZJOI2006」

    [题目描述] 物流公司要把一批货物从码头\(A\)运到码头\(B\).由于货物量比较大,需要\(n\)天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运 ...