1. JProfiler概览
- 使用简单
- 低开销,对应用影响小
- 支持对JDBC、JPA和NoSQL的数据库分析
- CPU,Thread,Memory分析功能尤其强大
- 支持多种IDE和应用服务器
- 支持多种模式离线和在线的分析
- 跨平台(Linux,Windows,Mac,Solaris,AIX,HP-UX)
- 官网:https://www.ej-technologies.com/products/jprofiler/overview.html
2. Jprofiler采集流程和架构
采集流程
- JProfiler GUI中下达监控的指令
- JProfiler GUI 通过socket发送指令给被剖析jvm中的JProfile Agent
- JProfiler Agent收到指令后,将该指令转换成相关需要监听的事件或者指令,来注册到JVMTI上或者直接让JVMTI去执行某功能(例如dump jvm内存)
- JVMTI 根据注册的事件,来收集当前jvm的相关信息。 例如: 线程的生命周期和状态;对象实例的生命周期;堆内存的实时信息等等
- JProfiler Agent将采集好的信息保存到内存中,按照一定规则统计好,通过socket发送给JProfiler GUI
- JProfiler GUI Render 渲染成最终的展示效果
Jrofiler架构
3. 启动模式
Attach mode
对于剖析Java1.6或更高版本,JProfiler支持连接到一个正在运行的JVM并加载剖析代理。不过链接模式也有一些缺点,因为分析界面的一些功能在链接模式下无法使用,如下图,LiveMemory提示无法显示数组的分配情况。
Remote Attach mode
- 1. 启动要分析的进程
启动命令中不需要设置任何和agentlib有关的参数
- 2. 在远程主机运行jpenable
选择要分析的进程,模式和监听的端口号
3. 在本地启动jprofiler gui
Profile at startup
若要在启动时分析应用程序,在创建JVM前就必须激活剖析代理,将指定的JProfiler Agent手动加载到被剖析jvm。JProfiler GUI 将收集信息类型和策略等配置信息通过socket发送给JProfiler Agent,收到这些信息后该jvm才会启动。在被分析的jvm 的启动参数增加下面内容:语法: -agentpath:[path to jprofiler library]
java -agentpath:/home/linux-x64/libjprofilerti.so=port=8849 -jar /home/frank/test.jar|
Prepare for profiling:
和Profile at startup的主要区别:被分析的jvm不需要收到JProfiler GUI 的相关配置信息就可以启动, 只需要加一个nowait启动参数即可
Offline profiling
一般用于适用于不能直接调试线上的场景。Offline profiling需要将信息采集内容和触发策略打包成一个配置文件config.xml,在线上启动该jvm 加载 JProfiler Agent时,加载该xml。那么JProfiler Agent会根据Trigger的类型会生成不同的信息。例如: heap dump; thread dump; method call record等
语法
|
-agentpath:/home/2080/jprofiler8/bin/linux-x64/libjprofilerti.so=offline,id=151,config=/home/2080/config.xml
|
- 下面是使用了离线模式,并使用了每隔一秒dump heap 的Trigger:
· [[图片上传失败...(image-d433d4-1543051624595)]](javascript:;)
4. 数据采集方式
JProfiler采集方式分为两种:Sampling和Instrumentation
Sampling
类似于样本统计, 每隔一定时间(5ms)将每个线程栈中方法栈中的信息统计出来。优点是对应用影响小,缺点是一些数据/特性不能提供(例如:方法的调用次数)
Instrumentation
在class加载之前,JProfier把相关功能代码写入到需要分析的class中,对正在运行的jvm有一定影响。优点: 功能强大,但如果需要分析的class多,那么对应用影响较大,一般配合Filter一起使用。所以一般JRE class和framework的class是在Filter中通常会过滤掉。
5. JProfiler核心概念
Filter
什么class需要被分析。分为包含和不包含两种类型的Filter。
Profiling Settings
收据收集的策略:Sampling和 Instrumentation,一些数据采集细节可以自定义.
Triggers
一般用于offline模式,告知JProfiler Agent 什么时候触发什么行为来收集指定信息.
Live memory:
class/class instance的相关信息。 例如对象的个数,大小,对象创建的方法执行栈,对象创建的热点。
Heap walker
对一定时间内收集的内存对像信息进行静态分析,功能强大且使用。包含对象的outgoing reference, incoming reference, biggest object等
CPU views
CPU消耗的分布及时间(cpu时间或者运行时间); 方法的执行图; 方法的执行统计(最大,最小,平均运行时间等)
Thread
当前jvm所有线程的运行状态,线程持有锁的状态,可dump线程
Monitors & locks
所有线程持有锁的情况以及锁的信息
Telemetries:
包含heap, thread, gc, class等的趋势图(遥测视图)
6. 实践
内存泄露
- Live memory->All Objects,显示当前进程的对象的类型、数量和占用内存大小
- Live memory->Recored Objects,开始记录新生成的对象
- Heap warlker,跟踪生成对象的调用栈
- 根据调用栈找到生成对象的位置,即可分析到内存泄露的原因
CPU利用率高
- 调用树
- 热点区域图,显示当前进程不同方法调用占用CPU的比率,点击CPU占用率最高的方法,展开的调用树可以定位到哪行代码最消耗CPU资源
7. 和其他工具的对比
常用Java分析图形工具有Jprofiler、Jconsole、VisualVm和YourKit,还有jdk自带命令行工具jstack、jmap和jstat等等,命令行工具只能分析进程在某一个时间点的状态,相当于拍了一张照片,对于像死锁,CPU占用率100%的问题,比较好处理,命令行工具的优势是分析线上环境,而图形界面工具能够分析进程在一段时间内的状态,相当于拍了一段视频,图形界面的优势在于快速直观的分析问题,更多的情况,我们结合命令行工具和图形界面工具处理问题。与其他图形界面工具的对比如下:
IDE Integration
Jprofiler和YourKit支持与常用的集成开发工具集成,VisualVM需要通过插件的方式要集成开发工具集成
Memory + Memory Leak Analysis
都支持内存分析,Jprofler和youkit都能显示对象的个数,占用大小,以及生成对象的调用关系
CPU Profiling
都支持热点区域分析,而jprofiler能够通知指定时间段方法的执行次数
Database Statement Monitoring
Jprofiler和yourkit支持jdbc statement的分析,而VisualVM和jconsole不支持这种功能
Remote profiling
VisualVM是通过JMX采集远程应用的信息,jprofiler和Yourkit是通过远程代理加socket方式采集远程应用的信息
Summary
Jprofiler支持更多的功能,使用也方便