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

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

1、jps:显示虚拟机进程

  1. 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:统计监视虚拟机信息工具

  1. 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:实时的查看和调整虚拟机各项参数

  1. 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:内存映像工具

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

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

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

  该命令格式如下:

  jmap [参数] pid

  ①、常用参数如下:

  

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

  1.   -XX:+HeapDumpOnOutOfMemoryError
  2.  
  3.   -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 命令来生成堆内存快照呢?

  1. 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堆栈跟踪工具

  1. 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. 2019年7月20日 - LeetCode0002

    https://leetcode-cn.com/problems/add-two-numbers/submissions/ 我的方法: /** * Definition for singly-link ...

  2. 如何在windows上玩转redis的最新特性?

    想要了解redis的最新特性,可是windows下的可以安装的版本最高为3.2,想要验证redis的诸如stream特性的话,就无能为力了. 解决方法之一在windows上安装虚拟机,然后再虚拟机上安 ...

  3. C#中Thread.IsBackground 属性

    Thread  thread.IsBackground =true; //Gets or sets a value indicating whether or not a thread is a ba ...

  4. 小白学python-day05-IDE、格式化输出、For While循环、断点、continue、break

    今天是day05,以下是学习总结. 但行努力,莫问前程. ----------------------------------------------------------------------- ...

  5. python使用kazoo操作zookeeper时候出现的"kazoo.exceptions.ConnectionLoss"错误

    在往zk中写入数据的时候,突然遇到 “kazoo.exceptions.ConnectionLoss“错误,然而对zk链接进行检查,在set之前状态是”CONNECT“. 经过测试后发现是因为写入的字 ...

  6. husky+ prettier + commitlint 提交前代码检查和提交信息规范

    一.安装相关的包 npm install -D husky npm install -D lint-staged // lint钩子 npm install -D prettiernpm instal ...

  7. vue history模式下出现空白页情况

    问题描述:   vue搭建的项目,路由一直用的hash模式,所以url中都会带有一个“#”号.现在想要去掉“#”,于是使用history模式 { mode: 'history' },代码如下: imp ...

  8. Hack The Box Web Pentest 2019

    [20 Points] Emdee five for life [by L4mpje] 问题描述: Can you encrypt fast enough? 初始页面,不管怎么样点击Submit都会显 ...

  9. 激活函数、正向传播、反向传播及softmax分类器,一篇就够了!

    1. 深度学习有哪些应用 图像:图像识别.物体识别.图片美化.图片修复.目标检测. 自然语言处理:机器创作.个性化推荐.文本分类.翻译.自动纠错.情感分析. 数值预测.量化交易 2. 什么是神经网络 ...

  10. Java课堂 动手动脑6

    一.下列语句哪一个将引起编译错误?为什么?哪一个会引起运行时错误?为什么? m=d;d=m;d=(Dog)m;d=c;c=(Cat)m; 先进行自我判断, 1.代码: class Mammal{} c ...