必知必会的JavaJDK工具
JDK中有很多用于监控诊断的系统工具,对于Java程序员来说,无疑是用来了解自己程序运行时性能好坏的强大工具。
在JDK的bin目录下就可以找到这些工具。

JPS
在Linux有一个命令叫做ps,可以查看系统当前所有的进程,而JDK提供的jps也是类似,查看正在运行的Java进程。
可以看到该命令的参数。

在默认情况下,jps的输出信息包括Java进程的进程ID以及主类名。
我们还可以通过追加参数,来打印额外的信息。
例如,-l将打印模块名以及包名;

-v将打印传递给 Java 虚拟机的参数(如-XX:+UnlockExperimentalVMOptions -XX:+UseZGC);

-m将打印传递给主类的参数。

也可以使用-lvm一同使用。
在JVM启动时,会创建一个perf memory来存放PerfData,如果使用了参数-XX:-UsePerfData,禁止其它进程可见,那么jps命令就无法查看到该Java进程了。
Jstat
Jstat命令是用于打印某个Java进程的运行数据。

它支持使用-class查看类加载相关的数据,-compiler和-printcompilation查看即时编译相关的信息。
以及-gc等垃圾回收相关的数据。
执行时需要指定子命令和Java进程ID。

上图中,S0C和S1C代表了两个Survivor区的大小,C是指Capacity,容量。
S0U和S1U是指两个Survivor区已使用的大小,U是指Utility,实用。
EC和EU代表了Eden区的容量及使用。
OC和OU代表了Old区的容量及使用。
MC和MU代表了方法区的容量及使用。
CCSC和CCSU代表了压缩类空间的容量和使用大小 ,这个相对来说很少使用。
YGC代表了YoungGC,也就是年轻代GC发生的次数,更准确应该叫做MinorGC,YGCT代表所用的时间。
FGC代表FullGC发生的次数,它发生在老年代,FGCT代表所用的时间。
GCT代表所有GC所占用的时间。
可以看到11次YGC只耗时0.439,而8次FGC却用了数倍时间,1.419。
现在我们已经知道每一个标记代表什么了,可以尝试一下使用更详细的gc子命令来查看对应Java进程了。
jstat命令默认执行一次只返回一次,如果我想一直监控某个Java进程,可以添加可以时间参数。
如下图,jstat -gcnew 13496 500,后面跟一个500,就说明每500ms打印一次。

还可以指定打印的次数,比如jstat -gcnew 13496 500 5,后面跟500 5,就说明每500ms打印一次,总共打印5次。

在我们查看内存区域容量变化时,如果发现老年代的使用率不断增加,就说明有大量对象无法进行回收,我们的程序出现了性能上的问题。
再比如,我们可以添加-t来打印程序运行时间Timestamp,如果GCT占据了大部分程序运行时间,或者说这个时间比在持续上升时。就说明我们程序的堆内存已经在逐步走向奔溃了。

Jmap
知道程序有了问题,我们就可以利用Jmap命令来分析了。
Jmap同样包括多条子命令。

-clstats,该子命令将打印被加载类的信息。

-finalizerinfo,该子命令将打印所有待 finalize 的对象。

-histo,该子命令将统计各个类的实例数目以及占用内存,并按照内存使用量从多至少的顺序排列。此外,-histo:live只统计堆中的存活对象。

-dump,该子命令将导出 Java 虚拟机堆的快照。同样,-dump:live只保存堆中的存活对象。
我们通常会利用jmap -dump:live,format=b,file=filename.bin命令,将堆中所有存活对象导出至一个文件之中。

-heap,该子命令将输出当前堆中的配置信息。

Jinfo
Jinfo命令可用来查看目标Java进程的参数。

Jstack
这是一个非常有用的命令,它可以用来打印目标 Java 进程中各个线程的栈轨迹,以及这些线程所持有的锁,所以这个命令可以帮助我们处理死锁。
我们来写一个简单的会产生死锁的代码。

程序跑着跑着就会发生死锁。

我们使用jstack来查看。

可以看到线程Thread-a,它locked了String.class这个锁,在waiting等待Main.class。
而线程Thread-b,它locked了Main.class,在waiting等待String.class。
Jstack甚至帮我们找到了死锁发生的原因。

必知必会的JavaJDK工具的更多相关文章
- 2015 前端[JS]工程师必知必会
2015 前端[JS]工程师必知必会 本文摘自:http://zhuanlan.zhihu.com/FrontendMagazine/20002850 ,因为好东东西暂时没看懂,所以暂时保留下来,供以 ...
- [ 学习路线 ] 2015 前端(JS)工程师必知必会 (2)
http://segmentfault.com/a/1190000002678515?utm_source=Weibo&utm_medium=shareLink&utm_campaig ...
- mysql必知必会
春节放假没事,找了本电子书mysql必知必会敲了下.用的工具是有道笔记的markdown文档类型. 下面是根据大纲已经敲完的章节,可复制到有道笔记的查看,更美观. # 第一章 了解SQL## 什么是S ...
- 关于TCP/IP,必知必会的十个经典问题[转]
关于TCP/IP,必知必会的十个问题 原创 2018-01-25 Ruheng 技术特工队 本文整理了一些TCP/IP协议簇中需要必知必会的十大问题,既是面试高频问题,又是程序员必备基础素养. 一 ...
- 《MySQL必知必会》整理
目录 第1章 了解数据库 1.1 数据库基础 1.1.1 什么是数据库 1.1.2 表 1.1.3 列和数据类型 1.1.4 行 1.1.5 主键 1.2 什么是SQL 第2章 MySQL简介 2.1 ...
- 迈向高阶:优秀Android程序员必知必会的网络基础
1.前言 网络通信一直是Android项目里比较重要的一个模块,Android开源项目上出现过很多优秀的网络框架,从一开始只是一些对HttpClient和HttpUrlConnection简易封装使用 ...
- msql 必知必会笔记
Edit Mysql 必知必会 第一章 理解SQL 什么是数据库 数据库(database) 保存有组织的数据的容器 什么是表 一组特定类型的数据的结构化清单 什么是模式 数据库和表的布局及特性的 ...
- 《SQL必知必会》笔记
SQL必知必会(第4版) 作者:[美]Ben Forta 本书介绍了sql在不同数据库工具(Oracle.SQLite.SQL server.MySQL.MariaDB.PostgreSQL...)是 ...
- TCP/IP 必知必会的十个问题
本文整理了一些TCP/IP协议簇中需要必知必会的十大问题,既是面试高频问题,又是程序员必备基础素养. 一.TCP/IP模型 TCP/IP协议模型(Transmission Control Protoc ...
- TCP/IP,必知必会的
文章目录 前言 TCP/IP模型 数据链路层 网络层 ping Traceroute TCP/UDP DNS TCP连接的建立与终止 TCP流量控制 TCP拥塞控制 0 前言 本文整理了一些TCP/I ...
随机推荐
- Vue学习系列(二)——组件详解
前言 在上一篇初识Vue核心中,我们已经熟悉了vue的两大核心,理解了Vue的构建方式,通过基本的指令控制DOM,实现提高应用开发效率和可维护性.而这一篇呢,将对Vue视图组件的核心概念进行详细说明. ...
- C# 添加、读取、删除Excel文档属性
在文档属性中,可以设置诸多关于文档的信息,如创建时间.作者.单位.类别.关键词.备注等摘要信息以及一些自定义的文档属性.下面将通过C#程序来演示如何设置,同时对文档内的已有信息,也可以实现读取或删除等 ...
- python中的随机函数
python--随机函数(random,uniform,randint,randrange,shuffle,sample) 本文转载自:[chamie] random() random()方法:返回随 ...
- Web登录中的信心安全问题
1. 一个简单的HTML例子看看用户信息安全 标准的HTML语法中,支持在form表单中使用<input></input>标签来创建一个HTTP提交的属性,现代的WEB登录中, ...
- 百万年薪python之路 -- MySQL数据库之 MySQL行(记录)的操作(二) -- 多表查询
MySQL行(记录)的操作(二) -- 多表查询 数据的准备 #建表 create table department( id int, name varchar(20) ); create table ...
- Spring Data - Spring Data JPA 提供的各种Repository接口
Spring Data Jpa 最近博主越来越懒了,深知这样不行.还是决定努力奋斗,如此一来,就有了一下一波复习 演示代码都基于Spring Boot + Spring Data JPA 传送门: 博 ...
- Hadoop环境部署
1.虚拟机克隆 在VM界面点击查看-自定义-库,然后在左边我的计算机下右键点击安装好的第一个系统,然后管理-克隆,选择克隆系统所在的文件路径即可. 2.三台主机名字修改 root用户下: (1)编辑n ...
- MarkDown的常用语法
个人比较喜欢Markdown的语法,常用来做一些笔记,下面就简单介绍一下它的语法. 概览 宗旨 Markdown 的目标是实现「易读易写」. 可读性,无论如何,都是最重要的.一份使用 Markdown ...
- 设计模式C++描述----05.职责链(Chain of Responsibility)模式
一. 概述 职责链模式: 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 二. 举个例子 员工要求加薪 ...
- Jquery动态bind绑定已有函数,函数自动执行的问题解决方法
在bind后面的方法,不能带括号,带括号函数就自动执行了... <script> //通过子元素删除某行 function deleteRow() { var flag = confirm ...