《深入理解java虚拟机》读书笔记三——第四章
第四章 虚拟机性能监控与故障处理工具

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
转载请于明显处标明出处:
《深入理解java虚拟机》读书笔记三——第四章的更多相关文章
- 深入理解Java虚拟机 -- 读书笔记(1):JVM运行时数据区域
深入理解Java虚拟机 -- 读书笔记:JVM运行时数据区域 本文转载:http://blog.csdn.net/jubincn/article/details/8607790 本系列为<深入理 ...
- 【Todo】深入理解Java虚拟机 读书笔记
有一个在线系列地址 <深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)> http://book.2cto.com/201306/25426.html 已经下载了这本书(60多M ...
- 深入理解Java虚拟机读书笔记8----Java内存模型与线程
八 Java内存模型与线程 1 Java内存模型 ---主要目标:定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节. ---此处的变量和J ...
- 深入理解Java虚拟机读书笔记5----虚拟机字节码执行引擎
五 虚拟机字节码执行引擎 1 运行时栈帧结构 ---栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构,是虚拟机运行时数据区中的虚拟机栈的栈元素. ---栈帧中存储了方法的局部变 ...
- 深入理解Java虚拟机读书笔记3----类文件结构
三 类文件结构 1 Java虚拟机的两种中立特性 · 平台无关性 · 语言无关性 实现平台无关性和语言无关性的基础是虚拟机和字节码存储格式(Class文件). 2 Clas ...
- 深入理解Java虚拟机——读书笔记
首先 强烈推荐周志明老师的这本书,真的可以说是(起码中文出版界)新手了解Java虚拟机必须人手一本的教科书!!! 第二部分自动内存管理机制 由于Java虚拟机的多线程是通过线程轮流切换并分配处理器 ...
- 深入理解Java虚拟机读书笔记7----晚期(运行期)优化
七 晚期(运行期)优化 1 即时编译器(JIT编译器) ---当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这些代码认定为“热点代码”,包括被多次调用的方法和被多次执行的循环体. ...
- 深入理解Java虚拟机读书笔记4----虚拟机类加载机制
四 虚拟机类加载机制 1 类加载机制 ---概念:虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型. -- ...
- 深入理解Java虚拟机读书笔记1----Java内存区域与HotSpot虚拟机对象
一 Java内存区域与HotSpot虚拟机对象 1 Java技术体系.JDK.JRE? Java技术体系包括: · Java程序设计语言: · 各种硬件平台上的 ...
随机推荐
- bootstrap-daterangepicker
1,依赖关系 使用之前需要引用bootstrap.css daterangpicker.css jquery.js boostrap.js moment.js daterangpi ...
- 12-Factor与云原生Part2
12-Factor与云原生Part2 12-Factor 为构建如下的 SaaS 应用提供了方法论: 使用声明式格式来搭建自动化,从而使新的开发者花费最少的学习成本加入这个项目 和底层操作系统保持简洁 ...
- redis 5.0.7 源码阅读——跳跃表skiplist
redis中并没有专门给跳跃表两个文件.在5.0.7的版本中,结构体的声明与定义.接口的声明在server.h中,接口的定义在t_zset.c中,所有开头为zsl的函数. 一.数据结构 单个节点: t ...
- 【转】Makefile步步为营
Makefile步步为营 本目录主要包含Makefile一步步递进学习的示例代码 makefile代码实例:https://www.lanzous.com/i9m9npi step0:Makefile ...
- Python和Anoconda和Pycharm安装教程
简介 Python是一种跨平台的计算机程序设计语言.是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的.大型项目的开发. ...
- npm常用命令和脚手架使用
最近前端同学使用最多的莫过于vue,angualr,react等热门前端框架了.那么就避免不掉的使用npm命令,本人就经常因为这三个脚手架的使用而不得不百度相应的npm命令,不胜其烦,,,因此就整理一 ...
- 【DTOJ】1001:长方形周长和面积
DTOJ 1001:长方形周长和面积 解题报告 2017.11.05 第一版 ——由翱翔的逗比w原创 题目信息: 题目描述 已知长方形的长和宽,求长方形的周长和面积? 输入 一行:空格隔开的两个整 ...
- #6041. 「雅礼集训 2017 Day7」事情的相似度 [set启发式合并+树状数组扫描线]
SAM 两个前缀的最长后缀等价于两个点的 \(len_{lca}\) , 题目转化为求 \(l \leq x , y \leq r\) , \(max\{len_{lca(x,y)}\}\) // p ...
- 【第一篇】为什么选择xLua
为什么选择xLua 1. 易用性 Unity全平台补丁技术,可以运行时把C#实现(方法.操作符.属性.事件.构造函数)替换为lua的实现 自定义struct,枚举在lua和C#之间传递无C#的gc a ...
- Java多线程之互斥锁Syncharnized
public class Bank { private int money; private String name; public Bank(String name, int money) { th ...