简介JProfiler 是一个商业授权的Java剖析工具,由EJ技术有限公司,针对的Java EE和Java SE应用程序开发的。
它把CPU、执行绪和内存的剖析组合在一个强大的应用中。JProfiler可提供许多IDE整合和应用服务器整合用途。
JProfiler的是一个独立的应用程序,但其提供Eclipse和IntelliJ等IDE的插件。
它允许两个内存剖面评估内存使用情况和动态分配泄漏和CPU剖析,以评估线程冲突。
作用JProfiler直觉式的GUI **[图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)]**让你可以找到性能瓶颈、抓出内存漏失(memory leaks)、并解决执行绪的问题。它让你得以对heap walker作资源回收器的root analysis,可以轻易找出内存漏失;heap快照(snapshot)模式让未被参照(reference)的对象、稍微被参照的对象、或在终结(finalization)队列的对象都会被移除;整合精灵以便剖析浏览器的Java外挂功能。
操作模式- 本地会话实时分析模式用户一旦定义好了其应用程序启动方式,JProfiler即能对之进行设置,用户即刻便能从设置好的JVM中看到实时数据。用户若不想进行会话配置,其可以从多个IDE插件中选择其最喜欢的那个对应用程序进行配置。
- 远程会话实时分析模式通过修改Java开始命令行方式的VM参数,用户可使任意Java应用程序监听来自的JProfiler GUI的连接。该设置程序不但可以在本地计算机上运行,还可以在网络中作为某个设置程序的附加程序使用。此外,JProfiler还提供了相当多的集成向导,可用于主流的可以帮助用户安装和设置其应用程序的应用程序服务器。
- 离线分析模式用户无需通过JProfiler GUI连接应用程序即可对之进行设置。在离线设置模式下,用户可以使用功能强大的JProfiler触发系统或者JProfiler’ API对设置代理进行控制,然后将快照保存入磁盘。稍后用户便可使用命令行导出工具或者蚂蚁任务导出工具,在JProfiler GUI或编程方式的设置导出视图中打开这些快照。
- 快照比较在JProfiler中,用户可以将当前的所有设置数据保存为一个快照存入磁盘中。JProfiler提供了丰富的比较功能以对比两个或者多个快照之间的不同。用户可从编程的命令行比较工具和ant task比较工具中选择其一创建对比报告。
- 查看HPROF快照JProfiler能打开用JVM工具(比如jconsole、 jmap或通过-XX:+HeapDumpOnOutOfMemoryError JVM参数触发)创建的HPROF快照文
官网地址:https://www.ej-technologies.com/products/jprofiler/overview.html
网盘链接:https://www.aliyundrive.com/s/PetZgmsf6Do
JVM遥感勘测技术视图 Telemetries内存 Memory观察JVM的内部状态
显示堆栈的使用状况和堆栈尺寸大小活动时间表。
记录的对象 Recorded Objects显示一张关于活动对象与数组的图表的活动时间表。
记录的生产量 Recorded Throughput显示一段时间累计的JVM生产和释放的活动时间表。
垃圾回收活动 GC Activity显示一张关于垃圾回收活动的活动时间表。
类 Classes显示一个与已装载类的图表的活动时间表。
线程 Threads显示一个与动态线程图表的活动时间表。
CPU负载 CPU Load显示一段时间中CPU的负载图表。
内存视图 Live Momory所有对象 All ObjectsJProfiler的内存视图部分可以提供动态的内存使用状况更新视图和显示关于内存分配状况信息的视图。所有的视图都有几个聚集层并且能够显示现有存在的对象和作为垃圾回收的对象。
显示类或在状况统计和尺码信息堆上所有对象的包。你可以标记当前值并显示差异值。
记录对象 Record Objects显示类或所有已记录对象的包。你可以标记出当前值并且显示差异值。
分配访问树 Allocation Call Tree显示一棵请求树或者方法、类、包或对已选择类有带注释的分配信息的J2EE组件。
分配热点 Allocation Hot Spots显示一个列表,包括方法、类、包或分配已选类的J2EE组件。你可以标注当前值并且显示差异值。对于每个热点都可以显示它的跟踪记录树。
类追踪器 Class Tracker类跟踪视图可以包含任意数量的图表,显示选定的类和包的实例与时间。
堆遍历 Heap Walker 打开dump文件常用类 Classes在视图中找到增长快速的对象类型,在memory视图中找到Concurrenthashmap—点右键----选择“Show Selectiion In Heap Walker”,切换到HeapWarker 视图;切换前会弹出选项页面,注意一定要选择“Select recorded objects”,这样Heap Walker会在刚刚的那段记录中进行分析;否则,会分析tomcat的所有内存对象,这样既耗时又不准确;
在JProfiler的堆遍历器(Heap Walker)中,你可以对堆的状况进行快照并且可以通过选择步骤下寻找感兴趣的对象。
显示所有类和它们的实例,可以右击具体的类"Used Selected Instance"实现进一步跟踪。
分配 Allocations为所有记录对象显示分配树和分配热点。
索引 References为单个对象和“显示到垃圾回收根目录的路径”提供索引图的显示功能。还能提供合并输入视图和输出视图的功能。
时间 Time显示一个对已记录对象的解决时间的柱状图。
检查 Inspections显示了一个数量的操作,将分析当前对象集在某种条件下的子集,实质是一个筛选的过程。
CPU 视图 CPU Views访问树 Call TreeJProfiler 提供不同的方法来记录访问树以优化性能和细节。线程或者线程组以及线程状况可以被所有的视图选择。所有的视图都可以聚集到方法、类、包或J2EE组件等不同层上。
显示一个积累的自顶向下的树,树中包含所有在JVM中已记录的访问队列。JDBC,JMS和JNDI服务请求都被注释在请求树中。请求树可以根据Servlet和JSP对URL的不同需要进行拆分。
热点 Hot Spots显示消耗时间最多的方法的列表。对每个热点都能够显示回溯树。该热点可以按照方法请求,JDBC,JMS和JNDI服务请求以及按照URL请求来进行计算。
访问图 Call Graph显示一个从已选方法、类、包或J2EE组件开始的访问队列的图。
方法统计 Method Statistis显示一段时间内记录的方法的调用时间细节。
线程视图 Thread Views线程历史 Thread HistoryJProfiler通过对线程历史的监控判断其运行状态,并监控是否有线程阻塞产生,还能将一个线程所管理的方法以树状形式呈现。
显示一个与线程活动和线程状态在一起的活动时间表。
线程监控 Thread Monitor显示一个列表,包括所有的活动线程以及它们目前的活动状况。
线程转储 Thread Dumps显示所有线程的堆栈跟踪。
监控器视图 Monitor Views 当前锁定图表 Current Locking Graph显示JVM中的当前锁定情况。
当前监视器 Current Monitors显示当前正在等待或阻塞中的线程操作。
锁定历史图表 Locking History Graph显示记录在JVM中的锁定历史。
监控器历史 Monitor History显示等待或者阻塞的历史。
监控器使用统计 Monitor Usage Statistics计算统计监控器监控的数据。
idea插件配置
自己在idea插件中搜索jprofiler插件并安装,安装后需要重启!安装后配置如上图。
选择 attach to JVM 选择需要查看运行的jvm,双击或者点击open 选择模式
- Instrumentation模式记录所有的信息。包括方法执行次数等Sampling模式则只支持部分功能,不纪录方法调用次数等,并且更为安全
由于纪录信息很多,java运行会变的比正常执行慢很多,sampling模式则不会 - 常规使用选择sampling模式即可,当需要调查方法执行次数才需要选择Instrumentation模式,模式切换需要重启jprofiler
生成了如下文件,双击即可打开。比如:-Xms1m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError
HeapWarker 会分析内存中的所有对象,包括对象的引用、创建、大小和数量.
通过切换到References页签,可以看到这个类的具体对象实例。为了在这些内存对象中,找到泄漏的对象(应该被回收),可以在该对象上点击右键,选择“Use Selected Instances”缩小对象范围
- incoming
显示这个对象被谁引用 - outcoming
显示这个对象引用的其他对象
选择“Show In Graph”将引用关系使用图形方式展现;
选中该对象,点击Show Paths To GC Root,会找到引用的根节点.如上图。
通过创建分析该对象如果还不能定位内存泄露的地方,我们可以尝试使用Allocations页签,该页签显示对象是如何创建出来的;
我们可以从创建方法开始检查,检查所有用到该对象的地方,直到找到泄漏位置;
你需要在references视图和biggest视图手动添加对象到图表,它可以显示对象的传入和传出引用,能方便的找到垃圾收集器根源。
在工具栏点击"Go To Start"可以使堆内存重新计数,也就是回到初始状态。 查看线程快照


