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

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

1、jps:显示虚拟机进程

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

该命令有如下常用参数:

①、-l

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

②、-v

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

③、-m

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

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

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

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

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

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

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

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

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

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

①、常用参数有如下

②、vmid

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

③、采样间隔时间

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

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

相关表头信息:

Loaded:加载的类数量。

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

Unloaded:卸载的类数量。

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

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

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

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

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

该命令格式如下:

jinfo [ 选项 ] pid

①、常用选项如下

一、没有选项

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

二、-参数名称

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

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

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

四、-flag name=value

设置参数name的值为value

五、-sysprops

打印Java属性名称键值对。

②、pid

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

4、jmap:内存映像工具

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

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

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

该命令格式如下:

jmap [参数] pid

①、常用参数如下:

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

-XX:+HeapDumpOnOutOfMemoryError-XX:HeapDumpPath

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

1 packagecom.ys.algorithmproject.leetcode.demo.JVM;2

3 importjava.util.ArrayList;4 importjava.util.List;5

6 /**

7 * Create by YSOcean8 *9 */

10 public classJmapTest {11 private static final int _1MB = 1024*1024;12

13 /**

14 * 虚拟机参数设置: -Xms20M -Xmx20M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./15 *@paramargs16 */

17 public static voidmain(String[] args) {18 List list = new ArrayList<>();19 while(true){20 list.add(newObject[_1MB]);21 }22 }23 }

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

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

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

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

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

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

5、jstack:Java堆栈跟踪工具

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

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

该命令格式如下:

jstack [选项] pid

①、常用选项如下:

java虚拟机进程_Java虚拟机详解(七)------虚拟机监控和分析工具(1)——命令行...相关推荐

  1. 泛型java 代码讲解_Java泛型详解

    2516326-5475e88a458a09e4.png 一,打破砂锅问到底 泛型存在的意义? 泛型类,泛型接口,泛型方法如何定义? 如何限定类型变量? 泛型中使用的约束和局限性有哪些? 泛型类型的继 ...

  2. java method 注解_JAVA 注解详解及简单实例

    JAVA 注解详解及简单实例 何为注解 注解(Annotation)又称为元数据,在JDK1.5后引入,它的作用是: 生成文档  这是注解的原始用途,可以通过注解生成JavaDoc文档 跟踪代码的依赖 ...

  3. java泛型 初始化_Java泛型详解

    概述 泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应用. 什么是泛型?为什么要使用泛型? 泛型,即"参数化类型".一提到参数,最熟悉的就是定义方法时有 ...

  4. java递归函数例子_Java递归函数详解附案例

    递归函数在Java语言中得到了广泛的应用,它使得程序的编写过程更加的清晰明了.对Java初学者来讲,递归函数是需要学习的一个重要知识点.本文将附上案例和演示代码,具体为大家介绍递归函数的概念.要素以及 ...

  5. Day13-Java方法详解,方法的定义、重载,命令行传参,可变参数与递归

    Java方法详解 什么是方法? Java的方法是语句的集合,他们在一起执行一个功能 方法是解决一类问题的步骤的有序组合 方法包含于类或对象中 方法再程序中被创建,在其他地方被引用 [方法原子性]一个方 ...

  6. java随机数函数_java随机函数详解

    本文主要介绍java里的一些随机函数实现与用法,也会附带介绍一些随机数知识. 目前计算机实现的随机函数过程中,都是伪随机的,不过,可以实现统计学意义上的随机.比如手机鼠标移动位置,点击,系统的参数等等 ...

  7. java正则表达式原理_Java 正则表达式详解

    摘自:http://www.jb51.net/article/16829.htm 许多语言,包括 Perl.PHP.Python.JavaScript和JScript,都支持用正则表达式处理文本,一些 ...

  8. java生日正则表达式_Java正则表达式详解

    如果你曾经用过Perl或任何其他内建正则表达式支持的语言,你一定知道用正则表达式处理文本和匹配模式是多么简单.如果你不熟悉这个术语,那么"正则表达式"(Regular Expres ...

  9. java iterator对象_JAVA Iterator 详解 代码

    Iterator接口 1.所有实现了Collection接口的容器类都有一个Iterator方法用以返回一个实现了Iterator接口的对象 2.Iterator对象称为迭代器,用以方便的操作实现对象 ...

  10. java 函数内部类_java 内部类详解 转

    classOuter {classInner { } } (二) 内部类的访问规则 ​ A:可以直接访问外部类的成员,包括私有 ​ B:外部类要想访问内部类成员,必须创建对象 (三) 内部类的分类 ​ ...

最新文章

  1. 数据列表DataList模板之实例
  2. 轴添加点击事件_Q群答疑丨如何批量修改Revit轴网编号,为它添加前缀?
  3. php怎么解析xml,使用PHP快速解析复杂的XML文件
  4. 主板螺丝是机箱配还是主板配_要配新电脑,A520主板和B450主板哪一个更加值得购买?...
  5. 【AVR ASF4库函数学习笔记】一、使用Microchip Studio图形化配置工程
  6. LeetCode 1140. 石子游戏 II(DP)*
  7. 挖矿病毒解决实例(隐藏进程,文章较好)(入侵)
  8. 拳王虚拟项目公社:0成本售卖高考资料的虚拟资源教程,自动化的其他最简单最轻松玩法
  9. 售票pv操作java实现_随时随地打印手机照片,佳能瞬彩PV-123体验评测
  10. WebPack常用功能介绍
  11. Unity性能优化之物理引擎的优化(一)
  12. oeasy教您玩转linux010105详细手册man
  13. 区块链去中心化有什么优势?
  14. Android sqlite执行insert,英文单引号报错问题的解决
  15. 机器学习:决策树的预剪枝和后剪枝
  16. 怎样成为一名专业的程序员?
  17. 企业如何查负面和不良事件?
  18. 文件系统(ext2)
  19. c语言静态两个数码管显示0-99,按键控制计数,用两个数码管显示0到99。十位数为0的时候,显示为空白...
  20. 中年百度,舒适又失落的前半生

热门文章

  1. uboot1.1.6 start.s分析
  2. easyui datagrid 让某行复选框置灰不能选
  3. autofac文档:事件
  4. Oracle技巧集锦
  5. HttpCombiner.ashx处理
  6. 【Java】多线程编程
  7. 在线XML美化格式化工具
  8. Linux之nc命令
  9. 在线GIF图片帧拆分工具
  10. 老手萌新学习composer的使用