准备工作

更新时间:

本文简单介绍分析前的准备工作

第一步:生成数据源

应用诊断分析平台(ATP)只提供诊断分析能力,需要您准备数据源以供分析。

1. 什么是数据源?

取决于您想分析的应用问题,数据源有所不同。

Q:发现GC频率过快?GC回收效率低下?应用出现OutOfMemoryError等问题?

A:生成Java堆转储文件(Heap Dump)

Q:发现CPU负载过高?应用卡死?线程过高

A:生成Java栈文件

Q:评估GC性能?发现长时间卡顿?

A:寻找Java GC日志文件

2. 生成数据源

2.1 生成Java转储文件

Java转储文件即Heap dump文件,可以通过以下方式生成

说明

命令

jmap命令保存整个Java堆(推荐)

jmap -dump:format=b,file=heap.bin <pid>

jmap命令只保存Java堆中的存活对象

jmap -dump:live,format=b,file=heap.bin <pid>

jcmd命令保存整个Java堆

jcmd <pid> GC.heap_dump filename=heap.bin

在出现OutOfMemoryError的时候JVM自动生成(推荐)

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heap.bin

在出现Full GC前后JVM自动生成

-XX:+HeapDumpBeforeFullGC-XX:+HeapDumpAfterFullGC

编程的方式生成

使用HotSpotDiagnosticMXBean.dumpHeap()方法

使用ATP官方客户端生成

https://github.com/aliyun/aliyun-atp-sdk

-XX:+HeapDumpBeforeFullGC-XX:+HeapDumpAfterFullGC会导致JVM在发生Full GC前后都花费大量时间自动生成Java堆转储文件,建议您仅在需要的时候打开它们:

jinfo -flag +HeapDumpBeforeFullGC <pid> # 打开HeapDumpBeforeFullGC
jinfo -flag -HeapDumpAfterFullGC <pid> # 关闭HeapDumpAfterFullGC

2.2 生成Java栈文件

Java栈文件可以通过以下方式生成:

说明

命令

jstack生成,推荐

jstack <pid> > jstack.log

jcmd生成

jcmd 7662 Thread.print > jstack.log

使用ATP官方客户端生成

https://github.com/aliyun/aliyun-atp-sdk

2.3 生成Java GC日志文件

Java GC日志需要在应用启动时设置GC日志打印相关的JVM参数来开启,以下是推荐的参数设置,仅供参考:

# Java8及以下
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:<path>

# Java9及以上
-Xlog:gc*:<path>:time

其它的GC日志打印相关参数可参考Oracle官方文档

注:

  1. 使用以上参数可以将GC日志打印到<path>中,请务必指定path,否则GC日志默认会打印到stdout里,可能导致ATP无法正常解析

  2. 当前ATP只支持JDK8及以上版本的JDK生成的GC日志,且只支持Serial GC、Parallel GC、CMS GC、G1 GC和ZGC

第二步:上传数据源

生成数据源后,您需要将它上传到应用诊断分析平台。根据数据源的不同,您需要先在页面左侧选择合适的分析工具:

  • Java堆分析

  • Java线程栈分析

  • Java GC日志分析

然后点击 上传文件 按钮上传数据源。目前应用诊断分析平台支持以下上传方式:

  • 通过URL上传(为OSS文件生成URL链接请参见OSS文档

  • 通过OSS上传(需要您的授权,用以访问OSS文件)

  • 粘贴文本上传(只支持线程栈分析和GC日志分析,需小于10MB

  • 本地文件上传(只支持线程栈分析和GC日志分析,需小于10MB,仅支持*.log和*.txt扩展名

注意,因为ATP平台会下载您的文件,如果您使用OSS上传会产生流量费用,详情请参见OSS计费标准

第三步:开始分析

当您的数据源上传完成后,点击 分析 按钮进行分析,当分析完成后会自动跳转到分析结果页面以供您分析问题。具体如何进行问题分析请参见其它帮助文档