环境准备

首先,你需要从github将代码下载下来:

git clone https://github.com/jvm-profiling-tools/async-profiler

然后,进入到下载好的项目中,然后进行编译:

cd async-profiler

make

等待编译完成,可以在看到项目中多了一个build文件夹,这就是我们需要的东西,值得注意的是,async-profiler是少有的我在编译的时候没有遇到任何问题的工具,这也说明这个工具的易用性。当然,下面这些内容是必须的:

JAVA_HOME

GCC

关于async-profiler到底能做些什么事情,可以参考下面的描述:

async-profiler can trace the following kinds of events:

CPU cycles

Hardware and Software performance counters like cache misses, branch misses, page faults, context switches etc.

Allocations in Java Heap

Contented lock attempts of Java monitors

我主要关心的是CPU profiling这一个功能点,所以本文的重点也在CPU profiling这一个功能点上,其他的功能点可以自行去探索。关于async-profiler实现CPU profiling的原理以及为什么这么做,直接参考github上的readme就可以了,就不再这里赘述了,下面来看一下到底如何使用这个工具进行java应用的性能分析。

可以发现在async-profiler项目中有一个脚本叫做“profile.sh”,运行这个脚本,会输出如下提示内容:

Usage: ./profiler.sh [action] [options]

Actions:

start start profiling and return immediately

stop stop profiling

status print profiling status

list list profiling events supported by the target JVM

collect collect profile for the specified period of time

and then stop (default action)

Options:

-e event profiling event: cpu|alloc|lock|cache-misses etc.

-d duration run profiling for seconds

-f filename dump output to

-i interval sampling interval in nanoseconds

-b bufsize frame buffer size

-t profile different threads separately

-o fmt[,fmt...] output format: summary|traces|flat|collapsed

is a numeric process ID of the target JVM

or 'jps' keyword to find running JVM automatically using jps tool

Example: ./profiler.sh -d 30 -f profile.fg -o collapsed 3456

./profiler.sh start -i 999000 jps

./profiler.sh stop -o summary,flat jps

其中几个重要的命令解释如下:

start : 开始进行应用的profile数据采集,如果没有设定采集时间的话会一直运行下去直到遇到stop命令

stop: 和start配合使用,用来停止应用的profile数据采集

status:检测工具的运行状态,比如可以看到是否已经不可用,或者已经运行多少时间了等信息

list:将可以采集的profile数据类型打印出来

-d N: 设定采集应用profile数据的时间,单位为秒

-e event:指定采集数据类型,比如cpu

其他的命令可以参考说明,并且可以结合自己实际操作来查看效果。下面来开始使用async-profiler工具来采集cpu profile数据,并且配合火焰图生成工具工具FlameGraph来生成cpu火焰图,并且从火焰图中找到热点代码。FlameGraph工具可以直接下载下来就可以使用:

git clone https://github.com/brendangregg/FlameGraph

首先将java应用运行起来,你可以试着运行下面的代码来进行测试:

import java.io.File; class Target{ private static volatile int value; private static void method1(){ for (int i = 0; i < 1000000; ++i)

++value;

} private static void method2(){ for (int i = 0; i < 1000000; ++i)

++value;

} private static void method3() throws Exception{ for (int i = 0; i < 1000; ++i) { for (String s : new File("/tmp").list()) {

value += s.hashCode();

}

}

} public static void main(String[] args) throws Exception{ while (true) {

method1();

method2();

method3();

}

}

}

运行起来之后,可以使用jps命令来查看运行起来的java应用的pid,然后使用下面的命令开始使用工具进行cpu profile数据采集:

./profiler.sh start $pid

一段时间之后,比如30秒后,就可以使用下面的命令来停止数据采集了:

./profiler.sh stop $pid

然后,会打印处下面的信息:

可以很直观的看出,占用cpu时间最多的是method3,占用了93.06%的cpu时间,然后是method2和method1,分别占用2.93%和2.77%的cpu时间,所以很明显method3就是性能瓶颈,也就是所谓的热点代码,需要着手进行优化。当然,上面是有的命令式是比较简单的,下面来介绍一个比较厉害的命令,可以设定采集数据的时间,并且可以将采集到的数据dump起来,然后使用FlameGraph工具来生成火焰图进行直观的分析。当然,首先需要运行起来代码,并且使用jps找到应用的pid,然后可以使用下面的命令来进行数据采集任务:

./profiler.sh -d 10 -o collapsed -f /tmp/collapsed.txt pid

这个命令的意思是说,采集数据的时间为10秒,并且将数据按照collapsed规范进行dump,并且dump到/tmp/collapsed.txt这个文件,过了10秒之后,工具会自动停止,并且将cpu的profile数据dump到指定的路径(按照指定的规范),可以到/tmp/collapsed.txt查看具体的文件内容,但是很大程度上是看不懂的,所以需要使用FlameGraph工具来进行加工一下,可以使用下面的命令来生成火焰图:

~/github/FlameGraph/flamegraph.pl --colors=java /tmp/collapsed.txt > flamegraph.svg

当然,你需要指定你自己的FlameGraph的路径,上面命令中的是我的路径,很快,你就可以在当前目录下发现多了一个flamegraph.svg文件,使用chorm打开,就可以看到下面的图片内容(可以点击放大的):

可以看到,method3是最宽的,也就代表method3占用的cpu时间是最多的,这样看起来就直观很多了。

下面来看一下alloc类型的数据式怎么生成的,可以从这些数据中看出什么,运行下面的代码:

import java.util.concurrent.ThreadLocalRandom; public class AllocatingTarget implements Runnable{ public static volatile Object sink; public static void main(String[] args){ new Thread(new AllocatingTarget(), "AllocThread-1").start(); new Thread(new AllocatingTarget(), "AllocThread-2").start();

} @Override public void run(){ while (true) {

allocate();

}

} private static void allocate(){ if (ThreadLocalRandom.current().nextBoolean()) {

sink = new int[128 * 1000];

} else {

sink = new Integer[128 * 1000];

}

}

}

然后使用jps命令取到该应用的pid,然后执行下面的命令:

./profiler.sh start -e alloc pid

一段时间之后,可以使用下面的命令来停止数据采集:

./profiler.sh stop -e alloc pid

然后就会看到下面的输出:

可以看出各种类型的对象生成量,并且可以看到是从什么路径生成的(所谓路径就是类->方法->方法->...),当然,这只是该工具的一种玩法,其他复杂而有趣的玩法需要不断挖掘,并且结合实际应用来发现。

java profiler 工具_(转)Java应用性能分析工具:async-profiler相关推荐

  1. Web应用性能分析工具—HAR文件

    Web应用性能分析工具-HAR文件 来源 https://raynorli.com/2018/06/11/web-performance-analysis-har-file/ 客户经常有的一个问题就是 ...

  2. Java应用性能分析工具:async-profiler(配合FlameGraph生成火焰图)

    前言: 及时对项目或者服务器Java应用性能进行性能检测,并且分析检测结果数据,发现热点代码是一项充满意义的工作,因为可能因为某一段热点代码会拖慢整个系统的运行,这是不可忍受的,发现热点代码之后需要及 ...

  3. Java应用性能分析工具:async-profiler

    https://www.jianshu.com/p/9364028cca4e 厉害的内容 及时对项目进行性能检测,并且分析检测结果数据,发现热点代码是一项充满意义的工作,因为可能因为某一段热点代码会拖 ...

  4. java日志切割工具_用 Java 实现的日志切割清理工具

    对于服务器的日常维护来说,日志清理是非常重要的事情,如果残留日志过多则严重浪费磁盘空间同时影响服务的性能.如果用手工方式进行清理,会花费太多时间,并且很多时候难以满足实际要求.例如:如何在每个星期六凌 ...

  5. java 封装优化工具_利用Java注解的简单封装的一次优化

    悟红尘:​zhuanlan.zhihu.com 在我们的项目中和后台的通信的时候,为了防止别人截获并篡改信息,于是决定启用一套自己验签规则,那就是将所有属性的值拼接起来进行SHA256签名,在这个字符 ...

  6. java 开发人员工具_每个Java开发人员都应该知道的10个基本工具

    java 开发人员工具 大家好,我们已经到了2019年的第二个月,我相信你们所有人都已经制定了关于2019年学习以及如何实现这些目标的目标. 我一直在撰写一系列文章,为您提供一些知识,使您可以学习和改 ...

  7. 轻量级java开发工具_成为 Java 程序员必备的 5 个工具

    简介:Java 是一门面向对象的编程语言,它有着简单性.分布式.健壮性.安全性.可移植性.多线程等诸多特点.它也在最近一次的编程语言排行榜中排名第一,并且是连续十二次位居榜首,也就是说 Java 在2 ...

  8. java gis项目_记录:GIS常用开发工具

    一.GIS软件 ArcGIS Erdas Envi QGIS:开源 国产:超图.中地MapGIS 二.二次开发编程语言 页面前端:html.css.JavaScript .JQuery.Bootstr ...

  9. java检测工具_常用Java代码质量检测评估工具

    常用Java代码质量检测评估工具 1. PMD from http://pmd.sourceforge.net/ PMD能够扫描Java 源代码,查找类似以下的潜在问题: 可能的bug--try/ca ...

最新文章

  1. merge-two-smerge-two-sorted-listsorted-lists
  2. 在SMARTFORMS中取消使用WORD作为编辑器
  3. tensorflow随笔-队列(1)
  4. java和php混合_PHP和Java强强联合 集成开发详解
  5. centos 安装 redmine 2.6.0.stable
  6. html业内响应,html5页面
  7. Spring Boot开发MongoDB应用实践
  8. 外设驱动库开发笔记38:RTD热电阻测温驱动
  9. 【Golang】如何不反序列化为前提的情况下,修改ProtoBuffer某个Tag的值
  10. Atitit 提升科技影响力----软件方面的.docx 目录 1. 大原则 2 1.1. 科技强人必须是创新型[ 2 1.2. 要有一定的体量和规模 2 1.3. 产业链齐全 底层基础 --高层应
  11. 【Codeforces】Chloe and the sequence (递归)
  12. 如何接受上级指令_职场老手教你怎么应对领导错误的指令,千万要注意这几点...
  13. 为你的YOLOv5任意版本添加Grad-CAM等热图可视化
  14. 【使用python和flask建个人博客】增加了重复类型的卡片功能,用于更好的完成日常的工作与生活
  15. 在Excel中如何制作K线
  16. 钉钉调用新版待办任务
  17. AIX报错(errpt)处理小记
  18. 【Python】欧氏距离和余弦距离
  19. 模块学习4:(1)通过MQTT协议和电信云平台的通信(内附MQTT协议V3.1.1的原版和中文参考资料)
  20. C++设计模式之策略模式(行为型模式)

热门文章

  1. 【目录】全志V3S学习记录
  2. 小米狂秀硬核技术!推多项产业AIoT方案,打造智能生活时代
  3. 【转载】哪些域名后缀可在工信部进行备案操作
  4. Scala - IEEE754 浮点标准与 Float / Double 转换
  5. [OHIF-Viewers]医疗数字阅片-医学影像-cornerstone-core-Cornerstone.js提供了一个完整的基于Web的医学成像平台。...
  6. nacos项目启动失败[NA] failed to request
  7. nvenc硬件编码相关设置
  8. BPR的几种经典方法(转)
  9. 朋友圈集赞,简洁壁纸,玩游戏学git
  10. QPushButton禁用状态文字变形变粗