Java性能利器-Jprofiler

1. JProfiler概览

    1. 使用简单
    1. 低开销,对应用影响小
    1. 支持对JDBC、JPA和NoSQL的数据库分析
    1. CPU,Thread,Memory分析功能尤其强大
    1. 支持多种IDE和应用服务器
    1. 支持多种模式离线和在线的分析
    1. 跨平台(Linux,Windows,Mac,Solaris,AIX,HP-UX)
  • 官网:https://www.ej-technologies.com/products/jprofiler/overview.html

2. Jprofiler采集流程和架构

采集流程
  • image.png
    1. JProfiler GUI中下达监控的指令
    1. JProfiler GUI 通过socket发送指令给被剖析jvm中的JProfile Agent
    1. JProfiler Agent收到指令后,将该指令转换成相关需要监听的事件或者指令,来注册到JVMTI上或者直接让JVMTI去执行某功能(例如dump jvm内存)
    1. JVMTI 根据注册的事件,来收集当前jvm的相关信息。 例如: 线程的生命周期和状态;对象实例的生命周期;堆内存的实时信息等等
    1. JProfiler Agent将采集好的信息保存到内存中,按照一定规则统计好,通过socket发送给JProfiler GUI
    1. JProfiler GUI Render 渲染成最终的展示效果

Jrofiler架构

  • image.png

3. 启动模式

Attach mode

对于剖析Java1.6或更高版本,JProfiler支持连接到一个正在运行的JVM并加载剖析代理。不过链接模式也有一些缺点,因为分析界面的一些功能在链接模式下无法使用,如下图,LiveMemory提示无法显示数组的分配情况。

image.png
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

  1. 一般用于适用于不能直接调试线上的场景。Offline profiling需要将信息采集内容和触发策略打包成一个配置文件config.xml,在线上启动该jvm 加载 JProfiler Agent时,加载该xml。那么JProfiler Agent会根据Trigger的类型会生成不同的信息。例如: heap dump; thread dump; method call record等

  2. 语法

|

-agentpath:/home/2080/jprofiler8/bin/linux-x64/libjprofilerti.so=offline,id=151,config=/home/2080/config.xml

|

  1. 下面是使用了离线模式,并使用了每隔一秒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支持更多的功能,使用也方便

推荐阅读更多精彩内容