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工具的更多相关文章

  1. 2015 前端[JS]工程师必知必会

    2015 前端[JS]工程师必知必会 本文摘自:http://zhuanlan.zhihu.com/FrontendMagazine/20002850 ,因为好东东西暂时没看懂,所以暂时保留下来,供以 ...

  2. [ 学习路线 ] 2015 前端(JS)工程师必知必会 (2)

    http://segmentfault.com/a/1190000002678515?utm_source=Weibo&utm_medium=shareLink&utm_campaig ...

  3. mysql必知必会

    春节放假没事,找了本电子书mysql必知必会敲了下.用的工具是有道笔记的markdown文档类型. 下面是根据大纲已经敲完的章节,可复制到有道笔记的查看,更美观. # 第一章 了解SQL## 什么是S ...

  4. 关于TCP/IP,必知必会的十个经典问题[转]

    关于TCP/IP,必知必会的十个问题 原创 2018-01-25 Ruheng 技术特工队   本文整理了一些TCP/IP协议簇中需要必知必会的十大问题,既是面试高频问题,又是程序员必备基础素养. 一 ...

  5. 《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 ...

  6. 迈向高阶:优秀Android程序员必知必会的网络基础

    1.前言 网络通信一直是Android项目里比较重要的一个模块,Android开源项目上出现过很多优秀的网络框架,从一开始只是一些对HttpClient和HttpUrlConnection简易封装使用 ...

  7. msql 必知必会笔记

    Edit Mysql 必知必会 第一章 理解SQL 什么是数据库 数据库(database) 保存有组织的数据的容器 什么是表  一组特定类型的数据的结构化清单 什么是模式  数据库和表的布局及特性的 ...

  8. 《SQL必知必会》笔记

    SQL必知必会(第4版) 作者:[美]Ben Forta 本书介绍了sql在不同数据库工具(Oracle.SQLite.SQL server.MySQL.MariaDB.PostgreSQL...)是 ...

  9. TCP/IP 必知必会的十个问题

    本文整理了一些TCP/IP协议簇中需要必知必会的十大问题,既是面试高频问题,又是程序员必备基础素养. 一.TCP/IP模型 TCP/IP协议模型(Transmission Control Protoc ...

  10. TCP/IP,必知必会的

    文章目录 前言 TCP/IP模型 数据链路层 网络层 ping Traceroute TCP/UDP DNS TCP连接的建立与终止 TCP流量控制 TCP拥塞控制 0 前言 本文整理了一些TCP/I ...

随机推荐

  1. js判断是否为空和typeof的用法

    (1)typeof作用用于查看数据类型 (2)typeof用法typeof 返回值类型有number, string, boolean, function, undefined, objectPS:在 ...

  2. Java学习笔记之基础语法(数据类型)

    8种基本数据类型    整型:   byte[1字节]          short[2字节]        int[4字节]         long[8字节]      1,四种整型之间的区别:申 ...

  3. 渗透测试-基于白名单执行payload--Compiler

    复现亮神课程 0x01 Compiler前言 说明:Microsoft.Workflow.Comiler.exe是.NET Framework默认自带的一个实用工具,用户能够以XOML工作流文件的形式 ...

  4. go-关键字-变量

        var 声明变量 const 常量的关键字, 常量不能出现只声明不赋值的情况. 名字首字母为大写的程序实体可以被任何代码包中的代码访问到. 名字首字母为小写的程序实体则只能被同一个代码包中的代 ...

  5. sqlserver 查看最耗时的前10个存储过程

    SELECT TOP OBJECT_NAME(a.object_id,database_id) SP_Name, DB_NAME(a.database_id) Database_Name, a.cac ...

  6. L2-007. 家庭房产(并查集)

    #include <cstdio> #include <set> #include <vector> #include <algorithm> usin ...

  7. RIDE-工程、测试套件、测试用例三者关系

    理论 type的选择: 一般来说:测试项目(directory)-测试套件(file)-测试用例 本质上,“测试项目”和“测试套件”并没有什么区别,但是testcase只能放在file类型的test ...

  8. Mybaits 源码解析 (一)----- 搭建一个mybatis框架(MyBatis HelloWorld)

    源码分析之前先搭一个mybatis的demo,这个在看源码的时候能起到了很大的作用,因为在看源码的时候,会恍然大悟,为什么要这么配置,为什么要这么写.(老鸟可以跳过这篇) 开发环境的准备 创建mave ...

  9. 算法<初级> - 第一章 排序相关问题

    算法 - 第一章 时间复杂度: Big O 时间/空间复杂度计算一样,都是跟输入数据源的大小有关 n->∞ O(logn) 每次只使用数据源的一半,logn同理 最优解 先满足时间复杂度的情况最 ...

  10. leetcode系列---3Sum C#code

    Function: public static List<int[]> SumSet(int[] array) { List<int[]> result = new List& ...