前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >heapdump

heapdump

作者头像
用户7798898
发布2022-05-09 16:31:05
9750
发布2022-05-09 16:31:05
举报

通过上一篇 监控和管理生产环境spring boot actuator 我们可以知道可以通过boot集成的actuator插件来监控并管理服务的运行状况,处理由于某种不规范的操作,导致短时间内cpu内存暴增,通过log文件有时很难定位出现问题的环节。遇到这样的问题,除了通知运维同学通过jmap或jcmd指令导出jvm heap dump(堆转存文件)文件快速定位问题以外,如果我们的服务仍然可以正常工作的话,还可以通过actuator为我们提供的jvm heap dump接口来导出jvm heap dump文件。

loggers

显示和修改配置的loggers,比较简单,亲自调用看下接口信息即可

false

heapdump

dump 包含应用的 JVM 堆信息

true

ID

描述

敏感(Sensitive)

heapdump

第一步:下载heapdum文件以及配置根路劲操作

接口样例:http://localhost:8060/heapdump

当然,也可以进行设置监控服务访问根路径(如果不设置默认直接ip+端口+/监控接口id)访问即可。

则我们访问所有的监控服务接口路劲为: http://localhost:8060/actuator/heapdump

开发环境可以直接直接在浏览器地址栏中粘贴上面url信息进行下载heapdump文件即可。

注意:开发、测试以及生产环境端口可能有所不同,优先取决于我们启动boot jar服务指令command指令后面的--server.port参数

由于测试以及生产环境无法通过外网接口通过浏览器下载heap dump文件,所以我们可以直接通过curl命令直接调用接口进行下载我们

所需的接口文件。

以下为curl指令参数详情信息。

代码语言:javascript
复制
-A/--user-agent <string>              设置用户代理发送给服务器
-b/--cookie <name=string/file>    cookie字符串或文件读取位置
-c/--cookie-jar <file>                    操作结束后把cookie写入到这个文件中
-C/--continue-at <offset>            断点续转
-D/--dump-header <file>              把header信息写入到该文件中
-e/--referer                                  来源网址
-f/--fail                                          连接失败时不显示http错误
-o/--output                                  把输出写到该文件中
-O/--remote-name                      把输出写到该文件中,保留远程文件的文件名
-r/--range <range>                      检索来自HTTP/1.1或FTP服务器字节范围
-s/--silent                                    静音模式。不输出任何东西
-T/--upload-file <file>                  上传文件
-u/--user <user[:password]>      设置服务器的用户和密码
-w/--write-out [format]                什么输出完成后
-x/--proxy <host[:port]>              在给定的端口上使用HTTP代理
-#/--progress-bar                        进度条显示当前的传送状态

这里-o(小写)与-O(大写)是有区别的

-o(小写):我们将接口流文件的内容写入指定文件中,也就是我们需要指定文件名称。

例如:

代码语言:javascript
复制
可以使用curl的内置option:-o(小写)保存网页
$ curl -o linux.html http://

执行完成后会显示如下界面,显示100%则表示保存成功

代码语言:javascript
复制
% Total    % Received % Xferd  Average Speed  Time    Time    Time  Current
                                Dload  Upload  Total  Spent    Left  Speed
100 79684    0 79684    0    0  3437k      0 --:--:-- --:--:-- --:--:-- 7781k

-O(大写):我们需要确保下载的url地址要具体到某个文件不然抓不下来。

例如:

代码语言:javascript
复制
# curl -O http://www.linux.com/hello.sh

由于我们是下载dump文件未指定到具体文件,是以文件流的形式进行下载的,所以我们需要使用-o(小写)参数进行下载接收流文件。

下载地址:

代码语言:javascript
复制
curl -o xxx.zip http://${host}:${port}/heapdump   ### xxx.zip后缀可以任意指定常规的压缩包后缀即可,如:tar.gz/zip/gzip
第二步:下载heap dump文件分析工具

 jhat 是JDK自带的用于分析JVM Heap Dump文件的工具,不用另外安装,使用下面的命令可以将堆文件的分析结果以HTML网页的形式进行展示。但分析起来不够友好。

 jhat <heap-dump-file>

1:可以参考使用IBM HeapAnalyzer工具,下载 ha457.jar  直接在本地执行 java -Xmx2g -jar ha*.jar 指令即可。通过Analysis view 可以分析看到dump文件中目前存在的大对象。

但IBM HeapAnalyzer工具在官网上描述已不在进行维护开发,建议我们结合使用Eclipse Memory Analyzer Tool (MAT) 与 IBM DTFJ Extension。参考:IBM HeapAnalyzer

 2:下载eclipse mat工具结合IBM DTFJ Extension 参考: IBM Memory Analyzer Tool (MAT)

Overview

Overview视图,即概要界面,显示了概要的信息,并展示了MAT常用的一些功能。

  • Details 显示了一些统计信息,包括整个堆内存的大小、类(Class)的数量、对象(Object)的数量、类加载器(Class Loader)的数量。
  • Biggest Objects by Retained Size 使用饼图的方式直观地显示了在JVM堆内存中最大的几个对象,当光标移到饼图上的时候会在左边Inspector和Attributes窗口中显示详细的信息。
  • Actions 这里显示了几种常用到的操作,算是功能的快捷方式,包括 Histogram、Dominator Tree、Top Consumers、Duplicate Classes,具体的含义和用法见下面;
  • Reports 列出了常用的报告信息,包括 Leak Suspects和Top Components,具体的含义和内容见下;
  • Step By Step 以向导的方式引导使用功能。

Histogram

直方图,可以查看每个类的实例(即对象)的数量和大小。

Dominator Tree

支配树,列出Heap Dump中处于活跃状态中的最大的几个对象,默认按 retained size进行排序,因此很容易找到占用内存最多的对象。

 OQL

MAT提供了一个对象查询语言(OQL),跟SQL语言类似,将类当作表、对象当作记录行、成员变量当作表中的字段。通过OQL可以方便快捷的查询一些需要的信息,是一个非常有用的工具。

 Thread Overview

此工具可以查看生成Heap Dump文件的时候线程的运行情况,用于线程的分析。

 Run Expert System Test

可以查看分析完成的HTML形式的报告,也可以打开已经产生的分析报告文件,子菜单项如下图所示:

常用的主要有Leak Suspects和Top Components两种报告:

  • Leak Suspects 可以说是非常常用的报告了,该报告分析了 Heap Dump并尝试找出内存泄漏点,最后在生成的报告中对检测到的可疑点做了详细的说明;
  • Top Components 列出占用总堆内存超过1%的对象。

 Open Query Browser 提供了在分析过程中用到的工具,通常都集成在了右键菜单中,在后面具体举例分析的时候会做详细的说明。如下图:

这里仅针对在 Overview 界面中的 Acations中列出的两项进行说明:

  • Top Consumers 按类、类加载器和包分别进行查询,并以饼图的方式列出最大的几个对象。菜单打开方式如下:
  • Duplicate Classes 列出被加载多次的类,结果按类加载器进行分组,目标是加载同一个类多次被类加载器加载。使用该工具很容易找到部署应用的时候使用了同一个库的多个版本。菜单打开方式如下图:

 Find Object by address 通过十六进制的地址查找对应的对象,见下图:

一般我们排查生产环境大对象的定位是非常关键的

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-02-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • heapdump
    • 第一步:下载heapdum文件以及配置根路劲操作
      • 第二步:下载heap dump文件分析工具
        • Overview
          • Histogram
            • Dominator Tree
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档