第四章 虚拟机性能监控与故障处理工具

1、JDK命令行工具

jps命令:

  • 作用:列出正在运行的虚拟机进程。
  • 格式:jps [option] [hostid]
  • 选项:-q 只输出LVMID(Local Virtual Machine Identifier)省略主类的名称。

      -m 输出虚拟机进程启动时传递给主类的main函数的参数

      -l 输出主类全名,如果进程执行的时jar包,输出Java路径

        -v 输出虚拟机进程启动的jvm参数,显示指定的参数列表,默认参数无法查看

jstat命令:

  • 作用:虚拟机统计堆信息监视工具,它可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。
  • 格式:jstat [option vmid [ interval [ s | ms] [ count ] ] ],option代表用户希望查询虚拟机的内容,主要分为类装载,垃圾收集,运行期编译情况,interval代表查询虚拟机间隔,count代表查询次数,若省略说明只查询一次。
  • 选项:-class 监视类装载,卸载数量,总空间以及类装载所耗费的时间。

        -gc监视Java堆状况,包括Eden区,两个survivor区,老年代,永久代等容量,已用空间,GC时间合计等信息。

jinfo命令:

  • 作用:Java配置信息工具,实时的查看和调整虚拟机各项参数,包括未被显示指定的参数的默认值,并且加入了运行期间修改参数的能力。
  • 格式:jinfo [option] pid
  • 选项:-flag 输出已命名vm参数的值

jmap命令:

  • 作用:Java内存映像工具,用于生成堆转储快照(一般称为heapdump或者dump文件),它还可以查询finalize执行队列,Java堆和永久代的详细信息,如空间使用率当前用的是那种收集器等。
  • 格式:jmap [option] vmid
  • 选项:-dump 生成Java堆转储快照。-dump: fomat=b, filename=<filename>

      -finalizerinfo显示出F-Queue中等待Finalizer线程执行finalizer方法的对象,只在Linux、Solaris平台有效。

      -heap显示堆中对象统计信息,只在Linux、Solaris平台有效。

      -histo显示堆中对象统计信息,包括类实例数据,合计容量。

      -F当虚拟机进程对dump选项没有响应时可使用这个选项强制生成dump快照,只在Linux、Solaris平台有效。

jhat命令:

  • 作用:虚拟机对转储快照分析工具,与jmap配合使用,来分析jmap生成的堆储快照,分析结果默认是以包为单位
  • 格式:jhat filename ,打开浏览器访问http://localhost:7000

jstack命令:

  • 作用:Java堆栈跟踪工具,用于生成虚拟机当前线程快照,线程快照就是当前虚拟机每一条线程正在执行的方法堆栈的集合,可以通过jstack来查看各个线程调用堆栈,就可以定位到线程出现停顿的常见原因。
  • 格式:jstack [option] vmid
  • 选项:-F当正常输出不被响应时,强制输出线程堆栈。

      -l除了堆栈外显示有关锁的附加信息。

      -m如果调用本地方法的话,可以显示C/C++的堆栈

HSDIS插件:

  • 作用:HotSpot虚拟机提供的反汇编插件,是让HotSpot的-XX:+PrintAssembly指令调用他来把动态生成的本地代码来分析问题。

2、JDK可视化工具

JConsole:

  • 作用:Java监视与管理控制台
  • 内存标签相当于jstat命令用于监视收收集器管理的虚拟机内存。
    package com.ecut.tool;
    
    import java.util.ArrayList;
    import java.util.List; public class MonitoringTest { static class OOMObject{
    public byte[] placeholder = new byte[64*1024];
    } public static void fillHeap(int num) throws InterruptedException {
    List<OOMObject> list = new ArrayList<>();
    for(int i =0; i < num ; i++){
    Thread.sleep(50);
    list.add(new OOMObject());
    }
    System.gc();
    } public static void main(String[] args) throws InterruptedException {
    fillHeap(1000);
    }
    }

    运行结果如下:

  • 线程标签相当于jstack命令遇到线程停顿时可以使用这个页签进行分析。
    package com.ecut.tool;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader; public class MonitoringThreadTest { /**
    * 死循环
    */
    public static void createBusyThread(){
    Thread thread = new Thread(new Runnable() {
    @Override
    public void run() {
    while (true);
    }
    },"testBusyThread");
    thread.start();
    } /**
    * 等待锁
    * @param lock
    */
    public static void createLockThread(final Object lock){
    Thread thread = new Thread(new Runnable() {
    @Override
    public void run() {
    synchronized (lock){
    try {
    lock.wait();
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    }
    },"testLockThread");
    thread.start();
    } public static void main(String[] args) throws IOException {
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader((System.in)));
    bufferedReader.readLine();
    createBusyThread();
    bufferedReader.readLine();
    createLockThread(new Object());
    } }

    运行结果如下:

  • 停顿的主要原因有等待外部的资源(数据库连接网络资源),死循环锁等待。

VisualVM插件:

  • 显示虚拟机进程及进程配置环境信息。
  • 监视应用程序的CPU、GC、堆、方法区以及线程信息。
  • dump以及分析堆转储快照。
  • 方法级的程序运行性能分析,找出被调用最多的,运行时间最长的方法。

源码地址:

https://github.com/SaberZheng/jvm-test

转载请于明显处标明出处:

https://www.cnblogs.com/AmyZheng/p/10525147.html

《深入理解java虚拟机》读书笔记三——第四章的更多相关文章

  1. 深入理解Java虚拟机 -- 读书笔记(1):JVM运行时数据区域

    深入理解Java虚拟机 -- 读书笔记:JVM运行时数据区域 本文转载:http://blog.csdn.net/jubincn/article/details/8607790 本系列为<深入理 ...

  2. 【Todo】深入理解Java虚拟机 读书笔记

    有一个在线系列地址 <深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)> http://book.2cto.com/201306/25426.html 已经下载了这本书(60多M ...

  3. 深入理解Java虚拟机读书笔记8----Java内存模型与线程

    八 Java内存模型与线程   1 Java内存模型     ---主要目标:定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节.     ---此处的变量和J ...

  4. 深入理解Java虚拟机读书笔记5----虚拟机字节码执行引擎

    五 虚拟机字节码执行引擎   1 运行时栈帧结构     ---栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构,是虚拟机运行时数据区中的虚拟机栈的栈元素.     ---栈帧中存储了方法的局部变 ...

  5. 深入理解Java虚拟机读书笔记3----类文件结构

    三 类文件结构 1 Java虚拟机的两种中立特性     · 平台无关性     · 语言无关性     实现平台无关性和语言无关性的基础是虚拟机和字节码存储格式(Class文件).   2 Clas ...

  6. 深入理解Java虚拟机——读书笔记

    首先 强烈推荐周志明老师的这本书,真的可以说是(起码中文出版界)新手了解Java虚拟机必须人手一本的教科书!!!   第二部分自动内存管理机制 由于Java虚拟机的多线程是通过线程轮流切换并分配处理器 ...

  7. 深入理解Java虚拟机读书笔记7----晚期(运行期)优化

    七 晚期(运行期)优化 1 即时编译器(JIT编译器)     ---当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这些代码认定为“热点代码”,包括被多次调用的方法和被多次执行的循环体.     ...

  8. 深入理解Java虚拟机读书笔记4----虚拟机类加载机制

    四 虚拟机类加载机制 1 类加载机制     ---概念:虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型.     -- ...

  9. 深入理解Java虚拟机读书笔记1----Java内存区域与HotSpot虚拟机对象

    一 Java内存区域与HotSpot虚拟机对象 1 Java技术体系.JDK.JRE?     Java技术体系包括:         · Java程序设计语言:         · 各种硬件平台上的 ...

随机推荐

  1. HTML连载68-形变中心点、形变中心轴

    一. 形变中心点介绍 <style> ul li { width: 100px; height: 100px; list-style: none; float:left; margin:0 ...

  2. leetcode面试题 02.06. 回文链表,解题心路

    目录 leetcode面试题 02.06. 回文链表,解题心路 1.题目描述 2.java语言题解一 3.java语言题解二 4.C语言题解一 leetcode面试题 02.06. 回文链表,解题心路 ...

  3. system.run

    客户端开启了remotecommand后可以在server调用该命令在agent上执行一些命令 命令中有逗号 zabbix_get -s xxx.xxx.xxx.xxx -k "system ...

  4. python实现串口通讯小程序(GUI界面)

    python实现串口通讯小程序(GUI界面) 使用python实现串口通讯需要使用python的pyserial库来实现,这个库在安装python的时候没有自动进行安装,需要自己进行安装. 1.安装p ...

  5. 简单的试了试async和await处理异步的方式

    今天无意中就来试了试,感觉这个新的方法还是非常行的通的,接下来我们上代码 这段代码想都不用想输出顺序肯定是//null null 233,当然出现这个问题还是因为它是同步,接下来我们就进行异步方式来处 ...

  6. MySQL 当记录不存在时插入(insert if not exists、dual )

    INSERT INTO clients(client_id, client_name, client_type)SELECT 10345, ’IBM’, ’advertising’FROM dualW ...

  7. Gird(2)

    目录 grid 布局(2) grid区域属性 网格线名称 grid-template-areas 属性 grid-auto-flow 容器内子元素的属性 grid 布局(2) grid区域属性 网格线 ...

  8. 浅谈python的第三方库——numpy(二)

    前一期博文中,初步探索了numpy中矩阵的几种运算操作,本文将展示numpy矩阵的元素抽取与合并操作. 1 元素抽取 在我们使用矩阵的时候,有时需要提取出矩阵的某些位置上的元素单独研究,这时就需要熟悉 ...

  9. W25Q64BV(FLASH)(SPI)中文手册

    64兆位串行SPI FLASH存储器 1.常规介绍 W25Q64BV(64兆位)串行FLASH存储器为一个空间大小,引脚,功耗限制的系统提供解决方案.25Q系列的灵活性和性能良好超越了普通的串行FLA ...

  10. 安装JumpServer到CentOS(YUM)

    运行环境 系统版本:CentOS Linux release 7.6.1810 (Core) 软件版本:JumpServer-1.4.8 硬件要求:最低2核4GB 官方文档:https://docs. ...