赞
踩
Java性能监控有很多工具,例如自带的Jvisualvm、商业软件jprofiler ,以及和其类似的YourKit Java Profiler;本次主要记录jprofiler的使用。
Jvisualvm
Jvisualvm 是java自带的性能分析工具,在JDK6以后已经作为Oracle JDK的一部分,放在bin目录下,可以直接打开使用。
Jvisualvm 可以分析CPU、内存、线程、生成jdk快照等。
Jvisualvm 是基于jdk分析接口,提供的可视化操作界面。
支持本地监控和远程连接监控。
打开方式
操作界面
Jprofiler
jprofiler 是一个商业的、分析JVM内部运行状况、以及服务器资源占用的工具。
jprofiler 是基于jdk分析接口、以及重写class字节码并收集方法执行信息后,提供的可视化分析界面
支持本地监控和远程连接监控。
jprofiler相对于Jvisualvm加入了字节码重写技术,并且提供了更多层面的监控信息。
jprofiler可以通过服务器或框架暴露的Mbeans进行远程操作。
帮助文档
安装
本机安装
本机安装对应的客户端
集成IDE插件进行
首先下载客户端进行安装。
官网下载URL
在IDEA插件库搜索jprofiler插件进行安装。
选择方法调用监控策略
jprofiler可以跟踪方法的调用树和CPU执行时间,有大体分为两种策略:
instrumentation 为全部采集,使用字节码重写技术对代码进行跟踪 。
Sampling 为对堆栈信息进行抽样分析(5ms一次),如果代码执行很快,有些可能采集不到。
官方策略说明
4. 接下来就是成功界面
远程服务器监控
一般情况下我们都在远程服务器上进行性能测试,所以对服务器的监控是很重要的部分。
下面记录一下jprofiler监控远程spring boot的过程。
服务器jprofiler安装
#下载
wget https://download-gcdn.ej-technologies.com/jprofiler/jprofiler_linux_11_1_4.sh
#授权
chomd +x jprofiler_linux_11_1_4.sh
#安装、按照提示操作即可
./jprofiler_linux_11_1_4.sh
#运行一个spring boot程序
nohup java -jar microservice-web-1.0-SNAPSHOT.jar &
#进入安装目录
cd /opt/jprofiler11/bin/
#运行jprofiler,并根据提示输入端口
./jpenable
本地连接
总体监控
默认jprofiler打开的是“遥感监测”界面,主要监控指标有CPU、内存、GC活动、线程等
动态内存监控
动态内存主要监控实时内存占用,可以用来查看各个对象的实例数和所耗内存;
除此之外还可以监控每个调用链过程中对内存的消耗。
堆行者-Heap walker
获取瞬时堆信息(注意会引起STW操作),并且进行相关数据分析。
cpu时间监控
可以监控代码对CPU占用时长,用来分析CPU占用热点代码
线程监控
可以查看各个线程的运行状态、时长
锁监控-死锁检测
可以监控系统死锁的情况、代码位置
jdbc分析
用来查看数据库连接数、db热点操作、sql执行时间等
JEE&Probes
此模块区别于方法级别的监控,主要是从更高层次例如http接口、socket、文件操作层面进行监控;这里主要介绍几个常用的。
http接口
监控服务器的http接口调用情况。
外部http接口调用
监控服务器调用外部的http接口情况。
外部socket
监控服务器调用外部的scoket情况。
服务器文件
监控服务器内部文件流使用情况。
Mbeans
部分服务或者java框架会提供外部的Mbeans,便于系统监控、配置、操作;普通开发场景下可能较少使用。
spring boot提供了公开的Mbeans用来关闭服务,此处演示远程关闭spring boot。
性能影响
测试对100个对象进行排序操作
200个并发在1s内执行;开启无限循环压测至10w个样本
jprofiler开启cpu时间记录
不使用jprofiler压测结果
使用jprofiler压测结果
cpu使用率
结论
jprofiler的确会对性能产生一定的影响,具体还要根据各自业务进行多场景的不同样本分析,这里的结论仅限参考。
jprofiler重写字节码可能会有未知的风险以及性能开销,生产禁止使用。
dump JVM快照操作会导致JVM STW ,只能在测试或者本机使用哦。
堆分析
JVM提供了jstack、jmap、jhat等小工具,主要是用来记录线程快照(jstack)、堆快照(jmap)、以及堆信息分析(jhat)。
在生产过程中,如果发生了内存泄露导致jvm所占内存越来越大,可以通过dump heap快照进行问题分析。
#使用jmap导出堆信息
jmap -dump:format=b,file=heap.bin PID
市面上有不少针对堆快照进行分析的工具,例如JVM自带的jhat、Eclipse提供的Memory Analyzer Tools(MAT)、以及Jprofiler。
jhat
jhat是JVM自带的快照分析工具;实测耗费内存严重,且速度慢;给了4倍的内存还磨磨唧唧半天也分析不出来,heap才2GB啊...
同时它还有个个缺点是界面不容易看,没有任何图形化,只有个超长的分析列表。
Jhat的优点是支持在远程解析,并提供在线访问结果的端口。
#使用jhat进行分析,并通过7000端口进行访问(jhat不建议使用)
jhat -J-mx512m heap.bin
MAT
Eclipse提供了Memory Analyzer Tools用来分析堆信息,下载界面。
mat支持在远程进行分析并生成zip文件,下载后打开即可通过html界面进行查看分析结果。
#下载
wget http://eclipse.stu.edu.tw/mat/1.10.0/rcp/MemoryAnalyzer-1.10.0.20200225-linux.gtk.x86.zip
#解压
unzip MemoryAnalyzer-1.9.1.20190826-linux.gtk.x86_64.zip
# 修改内存大小:-Xmx4096m (内存要大于heap文件,否则可能无法加载导致无法分析:)
vim MemoryAnalyzer.ini
#运行并生成结果
./ParseHeapDump.sh ../heap.bin org.eclipse.mat.api:suspects org.eclipse.mat.api:overview org.eclipse.mat.api:top_components
运行完成后,mat会在heap文件目录生成heap_Leak_Suspects.zip、heap_System_Overview.zip、heap_Top_Components.zip三个文件夹。
分别代表:可疑分析、概览、组件分析;解压后点击对应的html即可查看。
Jprofiler
目前还未找到jprofiler在远程机器上解析的操作步骤,目前先写个本地的,后续有再补充。
jprofiler首先需要将dump的堆快照后缀更改为.hprof,然后才能打开。
jprofiler打开dump文件较快,且功能也比较丰富、图形化界面强大。
jprofiler同时提供了更多的检测能力,比如分析重复对象以及空数组等(下图3)。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。