本文来自网易云社区
作者:陶奎
因工作需要,抽出些时间针对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+款云产品!
更多网易研发、产品、运营经验分享请访问网易云社区。