通过前面的几篇博客,我们介绍了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 args16 */17 public static void main(String[] args) {18 List 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

java dump分析工具_Java虚拟机详解(七)------虚拟机监控和分析工具(1)相关推荐

  1. java合法的数组声明_Java数组详解

    Java数组详解 数组详解 1.数组概述 数组是相同类型数据的有序集合 每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们 2.数组声明和创建 ①数组声明形式 dataType[] a ...

  2. java 1.8 泛型_Java 泛型详解

    原标题:Java 泛型详解 引言 泛型是Java中一个非常重要的知识点,在Java集合类框架中泛型被广泛应用.本文我们将从零开始来看一下Java泛型的设计,将会涉及到通配符处理,以及让人苦恼的类型擦除 ...

  3. java list取值_Java集合详解

    一.集合的由来 通常,我们的程序需要根据程序运行时才知道创建多少个对象.但若非程序运行,程序开发阶段,我们根本不知道到底需要多少个数量的对象,甚至不知道它的准确类型.为了满足这些常规的编程需要,我们要 ...

  4. java模型给泛型_java 泛型详解-绝对是对泛型方法讲解最详细的,没有之一

    对java的泛型特性的了解仅限于表面的浅浅一层,直到在学习设计模式时发现有不了解的用法,才想起详细的记录一下. 1. 概述 泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应 ...

  5. java 枚举使用例子_Java枚举详解及使用实例(涵盖了所有典型用法)

    在实际编程中,往往存在着这样的"数据集",它们的数值在程序中是稳定的,而且"数据集"中的元素是有限的. 例如星期一到星期日七个数据元素组成了一周的"数 ...

  6. java泛型常用特点_Java泛型详解

    对java的泛型特性的了解仅限于表面的浅浅一层,直到在学习设计模式时发现有不了解的用法,才想起详细的记录一下. 本文参考java 泛型详解.Java中的泛型方法. java泛型详解 1. 概述 泛型在 ...

  7. java threadpoolexecutor 返回值_Java ThreadPoolExecutor详解

    ThreadPoolExecutor是Java语言对于线程池的实现.池化技术是一种复用资源,减少开销的技术.线程是操作系统的资源,线程的创建与调度由操作系统负责,线程的创建与调度都要耗费大量的资源,其 ...

  8. java 注解变量赋值_Java Annotation详解...

    元数据的作用 如果要对于元数据的作用进行分类,目前还没有明确的定义,不过我们可以根据它所起的作用,大致可分为三类: l 编写文档:通过代码里标识的元数据生成文档. l 代码分析:通过代码里标识的元数据 ...

  9. java反射对象赋值_Java反射详解

    反射(Reflection)能够让运行于 JVM 中的程序检测和修改运行时的行为. Class类提供了以下方法 四个public方法,用于获取某个类的构造方法: Constructor getCons ...

  10. java内部类实现方式_Java内部类详解

    一 内部类是什么 Java类中不仅可以定义变量和方法,还可以定义类,这样定义在类内部的类就被称为内部类.根据定义的方式不同,内部类分为静态内部类,成员内部类,局部内部类,匿名内部类四种. Java为什 ...

最新文章

  1. java mysql 是否插入 成功_您如何确定使用Java和MySQL插入或更新是否成功?
  2. GAITC 2021智媒论坛丨曹立宏:AI和BI互助发展 智能媒体任重道远
  3. 思科高级路由与交换(CISCO 部分) 第5天
  4. 【bzoj2223】[Coci 2009]PATULJCI 主席树
  5. Java实现八皇后问题的解法(一维数组版本)
  6. [网络安全自学篇] 三十三.文件上传之绕狗一句话原理和绕过安全狗(六)
  7. endl与'\n'的区别
  8. 阮一峰的学习Javascript闭包(Closure)
  9. 提升技能必备网站(不定时更新)
  10. 【C语言入门】ZZULIOJ 1000-1005
  11. driver接管当前浏览器
  12. Redis-使用和原理
  13. 如何解决vmfution 虚拟机键盘鼠标延迟问题
  14. 三分钟部署Laxcus大数据管理系统
  15. java致谢_JAVA语言课程设计致谢例文.doc
  16. 通过CND方式引入elementui,vue,vuex,vue-router
  17. Qt on Mac 开发之 读取苹果系统OSX上的plist资源文件
  18. 最新研究表明人类的智力正在退化
  19. 位运算符——取反运算符~的理解
  20. java 裁剪网格纸_百度裁减网格纸

热门文章

  1. Project FreeEIM 2.0:重现失落的飞鸽传书
  2. 遍历ArrayList易犯错误
  3. 随便写写有关微软2004软件架构师峰会的个人感想(一)
  4. 只想安安静静地敲完一段代码
  5. python整体设计目标_Python 入門語法和類型(学习)
  6. ubuntu下ZED相机开发环境安装
  7. 最简易上手的numpy学习笔记二
  8. 推荐我们在B站免费的生信入门基础课程|测序原理,GO/GSEA/WGCNA
  9. 尤其适合程序员使用的TextMate for Mac
  10. python的魅力在哪_python的优势在哪