本文首发于微信公众号:javaadu

简单介绍

构建高性能的Java应用过程中,必然会遇到各种各样的问题,像CPU飙高、内存泄漏、应用奔溃,以及其他疑难杂症,这时可以使用Serviceability Agent(SA)。SA是JDK提供的一个强大的调试工具集,适用于语言层和虚拟机层,支持调试运行着的Java进程、core文件和虚拟机crash之后的dump文件。

SA的优点:可以呈现出类对象、能够识别出Java堆、堆边界、堆内对象、载入的类描述、栈内存、线程状态等信息。

安装

首先,我使用的操作系统版本是:macOS 10.12.6进。SA提供了两个调试工具:图形化的调试工具(HSDB)和命令行工具(CLHSDB)。这里我们演示下如何在Mac下启动SA HSDB。

  1. 设置JAVAHOME变量:export JAVAHOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_101.jdk/Contents/Home/
  2. SA HSDB的入口在$JAVAHOME/lib/sa-jdi.jar中,main方法在sun.jvm.hotspot.HSDB中,因此使用命令:sudo java -cp $JAVAHOME/lib/sa-jdi.jar sun.jvm.hotspot.HSDB,就可以启动HSDB调试器(入下图所示)

使用模式

单击左上角的File按钮可以看到:下拉框里指出了SA HSDB的三种使用模式:

  1. 链接到本地Hotspot进程上;
  2. 链接到core文件;
  3. 连接到远程的服务器进行Debug;

入门示例

这里我以自己维护的一个Java应用为例,演示了SA HSDB最重要的一些功能。我在本地启动了该服务,使用jps -l命令可以看到该服务的PID是51926,我使用第一种调试模式。

SA是快照调试器,因此,当在上图中点击OK的时候,account的Java进程会被暂停,直到我们断开对该进程的调试,而SA HSDB显示的则是SA刚刚链接上account进程那个时间点的进程快照,入下图所示。

常用工具

左侧的下拉列表主要是一些常用的工具,分别介绍如下【其他功能暂时不常用,可以遇到问题了再研究】:

  1. 类浏览器(Class Browser):可以查看account的Java进程中载入的类;遇到OOM异常时,可以使用这个工具分析有哪些类是不需要载入的,当然,也可以分析希望载入但是没载入的情况;

  1. 死锁检测(Deadlock Detection):检测Java代码层面的死锁,如果线程中存在死锁,则会显示线程死锁的信息和他们等待的锁;
  2. 对象检视器(Interceptor):可以查看Java线程对象的基本信息,也可以查看虚拟机内部的C 结构体信息;

  1. 对象直方图(Object Histogram):可以查看当前堆内存中对象的直方图,该工具在排查内存泄漏和OOM类问题的时候非常有效

快捷图标

右侧的小窗口上面有四个图表,是一些快捷方式;分别介绍如下:

  1. 进程检视器:给出线程对象的VM中间表示形式(即开发者可以看懂的格式)
  2. 栈内存:显示选中进程的栈内存数据

  • 左起第1栏是内存地址,请让我提醒一下本文里提到“内存地址”的地方都是指虚拟内存意义上的地址,不是“物理内存地址”,请不要弄混了这俩概念;
  • 第2栏是该地址上存的数据,以字宽为单位,本文例子中我是在macOS上跑64位的JDK8的HotSpot VM,字宽是64位(8字节);
  • 第3栏是对数据的注释,竖线表示范围,横线或斜线连接范围与注释文字
    1. 栈调用路径:显示线程的调用路径,可以看到方法名和地址,并能超链到方法的详细信息
    2. 线程的基本信息:包括线程状态、线程ID等等

SA的其他工具

  1. FinalizerInfo:该工具可用于打印出目标虚拟机所有可销毁对象的详细信息;
  2. HeapDumper:该工具可以用hprof格式转储Java堆的快照信息(类似于jmap命令);
  3. 永生代信息统计(PermStat):该工具用于打印出目标虚拟机中永生代的统计信息;Obje
  4. PMap:该工具用于打印出目标虚拟机进程的内存映射信息;
  5. 对象直方图(Object Histogram):对象直方图不仅可以在HSDB和CLHSDB中使用,还可以单独使用;
  6. OQL:该工具提供了类似脚本语言的命令,可以通过执行结构化对象查询语句,可以像写SQL一样,在Java堆中查找指定的对象;
  7. ClassDump:使用该工具可以导出目标虚拟机进程加载的类。

参考资料

  1. 《Java性能调优指南》
  2. Java ServiceabilityAgent(HSDB)使用和分析
  3. 借HSDB来探索HotSpot VM的运行时数据
  4. Java七武器系列长生剑 -- Java虚拟机的显微镜 Serviceability Agent

JVM问题排查工具:Serviceability-Agent介绍的更多相关文章

  1. JVM利器:Serviceability Agent介绍

    本文首发于公众号:javaadu 简单介绍 构建高性能的Java应用过程中,必然会遇到各种各样的问题,像CPU飙高.内存泄漏.应用奔溃,以及其他疑难杂症,这时可以使用Serviceability Ag ...

  2. jvm问题排查工具、命令

    dump生成:jmp -dump:live,format=b,file=/tmp/some.bin PID.其中,加上live表示只dump存活的对象. 线程栈信息生成:jstack PID > ...

  3. 自动化运维工具之 Ansible 介绍及安装使用

    一.初识Ansible 介绍: Absible 使用 模块(Modules)来定义配置任务.模块可以用标准脚本语言(Python,Bash,Ruby,等等)编写,这是一个很好的做法,使每个模块幂等.A ...

  4. Capsule:开源的 JVM 应用部署工具

    [编者按]本文作者 Ron Pressler 是 Parallel Universe 公司的创始人,拥有着丰富的高性能开发经验.通过这篇文章,Ron 向大家详细介绍了全新的开源 JVM 部署工具--C ...

  5. jvm系列(七):jvm调优-工具篇

    16年的时候花了一些时间整理了一些关于jvm的介绍文章,到现在回顾起来还是一些还没有补充全面,其中就包括如何利用工具来监控调优前后的性能变化.工具做为图形化界面来展示更能直观的发现问题,另一方面一些耗 ...

  6. 我不是bug神(JVM问题排查)

    Story background 回望2018年12月,这也许是程序员们日夜不得安宁的日子,皆因各种前线的系统使用者都需要冲业绩等原因,往往在这个时候会向系统同时写入海量的数据,当我们的应用或者数据库 ...

  7. 《深入理解Java虚拟机》(五)JVM调优 - 工具

    JVM调优 - 工具 JConsole:Java监视与管理控制台 JConsole是一个机遇JMX(Java Management Extensions,即Java管理扩展)的JVM监控与管理工具,监 ...

  8. 十二、jdk工具之jcmd介绍(堆转储、堆分析、获取系统信息、查看堆外内存)

    目录 一.jdk工具之jps(JVM Process Status Tools)命令使用 二.jdk命令之javah命令(C Header and Stub File Generator) 三.jdk ...

  9. Java虚拟机(六):JVM调优工具

    工具做为图形化界面来展示更能直观的发现问题,另一方面一些耗费性能的分析(dump文件分析)一般也不会在生产直接分析,往往dump下来的文件达1G左右,人工分析效率较低,因此利用工具来分析jvm相关问题 ...

随机推荐

  1. C#基础操作符详解(下)

    书接上文的基本操作符,下文介绍的是其他操作符: 4.2一元操作符: 只要有一个操作数跟在它后面就可以构成表达式,也叫单目操作符. ①&x和*x操作符(很少见有印象即可): 这两个操作符同样也需 ...

  2. zz:一个框架看懂优化算法之异同 SGD/AdaGrad/Adam

    首先定义:待优化参数:  ,目标函数: ,初始学习率 . 而后,开始进行迭代优化.在每个epoch  : 计算目标函数关于当前参数的梯度:  根据历史梯度计算一阶动量和二阶动量:, 计算当前时刻的下降 ...

  3. zzTensorflow技术内幕:

    性能优势 TensorFlow在大规模分布式系统上的并行效率相当高,如下图所示: 图5:TensorFlow并发效率 在GPU数量小于16时,基本没有性能损耗,在50块的时候,可以获得80%的效率,也 ...

  4. 数据结构or算法

    其实长久以来 mrxfyxj一直纠结着数据结构和算法到底有什么区别 只要学了一个算法就在惋惜她为什么不能是数据结构 产生这种想法的原因是mrxf觉得他blog里数据结构的东西很少 而mrxf自身又有一 ...

  5. 树形DP(超详细!!!)

    一.概念 1.什么是树型动态规划 树型动态规划就是在“树”的数据结构上的动态规划,平时作的动态规划都是线性的或者是建立在图上的,线性的动态规划有二种方向既向前和向后,相应的线性的动态规划有二种方法既顺 ...

  6. 守护进程--Supervisor

    01,介绍 02,安装部署 yum install python-setuptoolseasy_install supervisor 03,使用说明 supervisor安装成功之后,没有提供默认的配 ...

  7. (五)golang--常用的一些玩意

    \t--制表位 \n--换行符 \\--一个\ \"--一个” \r--回车 行注释://,一次性注释多行指令,选中代码后ctrl+/ 块注释:/* */ 代码规范: (1)官方推荐使用行注 ...

  8. [数据库] SQL 语法之基础篇

    一.什么是 SQL ? SQL 是 Structured Query Language(结构化查询语言)的缩写,是一种专门用来与数据库沟通的语言.与其他语言(如英语或 C.C++.Java 这样的编程 ...

  9. tensorflow 梯度裁剪

    gvs = optimizer.compute_gradients(loss) # 计算出梯度和变量值 capped_gvs = [(tf.clip_by_value(grad, -5e+10, 5e ...

  10. linux 下 的串口模拟器 minicom 退出方法

    ctrl + a (或 A) 进入 minicom 的配置模式:终端外观上无任何变化! 然后按下 z (或 Z) 方可打开配置帮助界面 然后按下 x (或 X)退出