zoukankan      html  css  js  c++  java
  • JVM利器:Serviceability Agent介绍

    本文首发于公众号: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. 设置JAVA_HOME变量:export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_101.jdk/Contents/Home/
    2. SA HSDB的入口在$JAVA_HOME/lib/sa-jdi.jar中,main方法在sun.jvm.hotspot.HSDB中,因此使用命令:sudo java -cp $JAVA_HOME/lib/sa-jdi.jar sun.jvm.hotspot.HSDB,就可以启动HSDB调试器(入下图所示)

    2017-12-1421.24.53.png

    使用模式

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

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

    2017-12-1421.24.44.png

    入门示例

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

    2017-12-1422.10.09.png

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

    2017-12-1422.16.52.png

    常用工具

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

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

      2017-12-1422.48.50.png

    2. 死锁检测(Deadlock Detection):检测Java代码层面的死锁,如果线程中存在死锁,则会显示线程死锁的信息和他们等待的锁;

    3. 对象检视器(Interceptor):可以查看Java线程对象的基本信息,也可以查看虚拟机内部的C++结构体信息;

      2017-12-1422.50.11.png

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

      2017-12-1422.45.11.png

    快捷图标

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

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

    2. 栈内存:显示选中进程的栈内存数据

      2017-12-1421.48.43.png

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

    4. 线程的基本信息:包括线程状态、线程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问题排查和优化、Java面试题、个人成长和自我管理等主题,为读者提供一线开发者的工作和成长经验,期待你能在这里有所收获。
    javaadu

  • 相关阅读:
    node
    github
    [模块] pdf转图片-pdf2image
    python 15 自定义模块 随机数 时间模块
    python 14 装饰器
    python 13 内置函数II 匿名函数 闭包
    python 12 生成器 列表推导式 内置函数I
    python 11 函数名 迭代器
    python 10 形参角度 名称空间 加载顺序
    python 09 函数参数初识
  • 原文地址:https://www.cnblogs.com/javaadu/p/10720762.html
Copyright © 2011-2022 走看看