Java应用两个Profiling工具对比_Jcmd和Jprofiler

勿忘初心2018-09-27 15:57

本文来自网易云社区

作者:陶奎


因工作需要,抽出些时间针对Java类型应用的一些Profiling工具进行了调研,主要目的是找到一个使用方便,对被测系统尽量少修改,可以采集CPU热点、调用链的工具。

调研情况如下:

从调研的情况来看,大部分工具有以下两个缺点:

1、修改被分析服务的JVM启动参数

2、离不开GUI的页面

虽然目前还没有解决我的需求,但其中有些工具还是很好用的。下面针对其中两个的使用介绍,Jcmd和Jprofiler。


内容太长,总结在前:

1、Jcmd:采集的内容基本能满足我们的需求;添加两个启动参数,通过指令生成快照文件,可以定制采集的时间段,采集的内容也较全,包括热点方法、调用树、线程、内存等统计信息。最关键的是,JDK(1.7之后)自带,非常轻量几乎对TPS、性能没有影响。强烈推荐

不足之处:生成的kfr格式的文件只能通过JMC打开;不是标准的文本格式的文件。

2、Jprofiler:功能很强大,可以分析热点方法,内存等,剖析很全面;缺点:离不开GUI界面的客户端,且在TPS较高的时候采集数据会对性能的影响很大,下降10倍以上,甚至导致采集的数据失去参考意义。此工具更适合在小负载或者开发阶段使用。


下面是使用介绍:


JCMD

JDK1.7以上版本自带,不需要额外下载安装

使用步骤:

1、启动参数配置:-XX:+UnlockCommercialFeatures -XX:+FlightRecorder,设置后重启服务器

2、生成快照:jcmd PID JFR.start delay=1s duration=60s name=serverRecording filename=/home/vcloud/recording_7106_1.jfr settings=profile

其中delay=1s表示延迟1秒开始收集,duration=60s表示收集1分钟的,参照链接:http://docs.oracle.com/javacomponents/jmc-5-4/jfr-runtime-guide/comline.htm#JFRUH191

等待60s完成之后将生成的jfr文件下载到本地,采集数据过程中性能几乎没有影响

双击打开(本地安装JDK1.7以上,并且配置好环境变量);展示如下

点击代码,展示概览

点击热点方法,展示按方法排行

支持筛选

Jcmd其他使用

jcmd实现jmap功能:jcmd 7106 GC.class_histogram |more

jcmd生成ThreadDump:jstack7106 Thread.print |more


JProfiler

环境说明:我使用的是9.2.1版本,在远程云主机上安装了Tomcat应用,启动时添加了Jprofiler的参数“-agentpath:/home/vcloud/jprofiler9/bin/linux-x64/libjprofilerti.so=port=8849”

本地也安装好了相同的版本。配置Session过程不详述了,相关操作步骤参照http://resources.ej-technologies.com/jprofiler/help/doc/

本地通过上面指定的端口,配置好Session之后,启动之后界面如下:

概要信息:

开启Method Statics

影响:TPS 360->110,MRT 13ms->40ms

开启内存分析:

影响:TPS 360->10几,MRT 13ms->250ms


其他功能暂不展示了,仅上面一项对性能指标影响太大就已经让我不考虑它了。

结论(前面已经描述)

1、Jcmd:采集的内容基本能满足我们的需求;添加两个启动参数,通过指令生成快照文件,可以定制采集的时间段,采集的内容也较全,包括热点方法、调用树、线程、内存等统计信息。最关键的是,JDK(1.7之后)自带,非常轻量几乎对TPS、性能没有影响。

不足之处:生成的kfr格式的文件只能通过JMC打开;不是标准的文本格式的文件。


2、Jprofiler:功能很强大,可以分析热点方法,内存等,剖析很全面;缺点:离不开GUI界面的客户端,且在TPS较高的时候采集数据会对性能的影响很大,下降10倍以上,甚至导致采集的数据失去参考意义。此工具更适合在小负载或者开发阶段使用。


网易云免费体验馆,0成本体验20+款云产品! 

更多网易研发、产品、运营经验分享请访问网易云社区