JProfiler学习笔记

转自https://blog.gmem.cc/jprofiler-study-note
内存视图(Memory Views)

该视图专一于对象的内存分配状况,包含如下选项卡:java

 All Objects 显示堆中实时的对象状况:显示某种类型(聚合级别能够是类、包等)对象的数量(Instance Count)、浅尺寸(Shallow size)关于浅尺寸的计算:

 

  1. 普通对象大小的计算不包括引用、类变量,由变量自己地址、基本类型的变量占用的内存等组成
  2. 数组总体计算,不分为单个元素计算大小/数量

注意,有些对象虽然没有引用,可是可能没被GC回收,能够手工Run GCgit

右击某一类型,能够转到Class Tracker或者Heaper Walker视图github

Recorded Objects 显示已经进行记录的对象。与All Objects相比,能够查看对象分配调用树(Allocation Call Tree)、分配热点(Allocation Hot Sports)点击工具栏:Start Memory,能够录制对象分配
Allocation Call Tree 显示选中的、已录制对象类型的分配调用数,分析调用栈的哪些栈帧比较消耗资源。从线程执行开始处,一直追溯到对象被建立的地方,对象占用内存的大小被显示,效果以下图:
Allocation Hot Sports 显示选中的、已录制对象类型的分配热点:以建立对象的方法为根显示调用树,效果以下图:alloc-hotsopt
Class Tracker  显示选中类型对象的实例个数的曲线图(按时间)
堆遍历(Heap Walker)

该视图用于静态分析堆快照,在生成快照以前,会进行一次Full GC。包含如下选项卡:算法

Classes 相似于Memory Views的All Objects,能够显示快照中全部对象的数量、大小。右击选择Use Selected Instances,则能够显示单种类型的数据
Allocations 分析对象分配状况:包括4种显示方式:Cumulated Allocation Tree:累积调用树,显示对象分配调用树,包含对象sizeAllocation Tree:调用树,显示对象分配调用树,包含对象sizeAllocation Tree Map:以Tree Map形式显示调用树Allocation Hot spots:显示分配对象最多的方法
Biggest Objects 显示占用内存最多的对象
References 显示单种类型的引用状况包含4种显示方式:Incoming references:其它对象对每个选中对象的引用Outcoming references:每个选中对象对其它对象的引用Cumulated Incoming references:显示其它对象、字段对选中对象类型的整体引用统计Cumulated Outcoming references:显示选中对象类型对其它对象、字段的整体引用统计
Time 分析对象分配的消耗时间
Inspections 提供多种精细的对象分配分析方式
Graph 图形化方式显示对象的引用图
CPU视图(CPU Views)

该视图用于分析方法的CPU占用时间,包括如下选项卡:windows

 Call Tree 显示自顶而下的调用堆栈的树,树的根是线程开始处,树的分叉表示的不一样的调用路径。暗红色显示当前节点及其子节点消耗的时间、高亮红色显示本级节点消耗的时间。

 

显示未过滤类对过滤类的直接调用,不显示深刻的调用,在被过滤类的左上角显示红三角。main方法、线程的run方法老是显示,不予过滤。
经过Profiling Settings能够选择CPU时间的度量方式:Elapsed time/Estimated CPU time,前者为Wall clock time(物理世界真实时间),后者为占用CPU的时间。因为操做系统的固有限制,10ms如下的时间可能不具备统计学意义。
界面右上角的Thread Status用于选择参与分析的线程状态,一般选择Runnable来分析性能问题,有时能够结合Net I/O、Blocked
 
工具栏Start Tracking,能够追踪某些任务在不一样线程之间的传递(调用点/执行点Call site/Execution site)

效果以下图:
call-tree数组

 Hot Spots 显示耗时最高的方法调用,显示消耗时间、平均消耗时间、调用次数等字段,以耗时方法为根,能够追溯到线程启动处Filtered Classes设置:选择被过滤类占用时间,能够单独列出,或者算在调用它的元素上(main、线程run不能过滤)
每一个方法可能被多个调用栈调用,百分比显示不一样调用栈对此方法的固有时间的“贡献”
不显示Total time,只显示Inherent Time
Call Graph 显示方法调用的序列,包括某个方法的调用与被调用状况
Method Stat 点击工具栏图标,能够录制方法的统计信息并进行分析
Call Tracer 点击工具栏图标,能够对方法调用进行跟踪
线程视图(Thread Views)

该视图用于分析线程的状态和历史分析、检测死锁,并能够获取线程快照,包含如下选项卡:服务器

Thread History 线程状态时间线,能够选择显示活着的或者死去的线程

 

绿色:Runnable:表示线程能够接受CPU调度,但不必定正在占用CPU,和线程优先级、调度算法、系统负载有关
黄色:Waiting:表示线程正在睡眠(java.lang.Thread.Sleep),或者在监视器上等待(java.lang.Object.wait),前者不会放弃占有的监视器
红色:Blocked:表示线程被阻塞,正在积极尝试进入同步区
浅蓝色:Net I/O:线程正在等待网络操做的完成,监听Socket或者读写Socket时产生此状态
效果图以下:
thread-history
Thread Monitor 显示线程的开始结束时间、父线程、状态等信息
Thread Dumps 获取线程快照,能够分析瞬时系统各线程的调用栈
监视器视图(Monitor Views)

该视图用于锁状态检测,包含如下选项卡:网络

 Current Locking Graph 当前锁状态图,显示监视器、以及在监视器上等待的线程。

 

黑色箭头表示当前拥有此监视器的线程app

红色虚线表示被阻塞的线程(积极尝试得到锁)工具

黄色箭头表示在监视器上等待的线程(java.lang.Object.wait)

效果图以下:

current-monitor

Current Monitors 显示当前活动的监视器,包括监视器状态、监视器类、等待线程、拥有者线程等信息
Locking History Graph 能够录制监视器锁定的历史
Monitor History 能够显示全部监视器的历史
Monitor Usage Stat 以监视器、线程等方式分组,显示监视器的使用统计,包括阻塞次数、阻塞持续时间、等待次数、等待持续时间等
虚拟机遥感视图(VM Telemetry Views)

该视图能够显示时间线上的系统宏观信息,包括如下选项卡:

Memory 显示已有、空闲内存的区域图
Recorded Objects 显示堆中对象(数组、非数组)的数量
Recorded Throughput 显示已记录对象的建立和销毁数量
GC Activity 显示GC活动率百分比
Classes 显示加载的类的数量
Threads 显示处于各类状态的线程的数量
CPU Load 显示CPU负载百分比
JavaEE以及探针(JEE & Probes)

能够使用多种探针来检测不一样的应用领域,包括:JDBC、JPA/Hibernate、JNDI、JMS、Servlet、RMI、Socket、WebServices、Files等。

剖析配置
触发器

用于在特定条件下触发剖析动做
触发条件:方法被调用、堆使用阈值、CPU使用率阈值、内存溢出异常、定时器、虚拟机启动、虚拟机关闭等
剖析动做:启/停录制、调用跟踪、监视器跟踪,触发堆dump、线程dump,启/停探针录制,保存快照,保存HPROF快照,运行脚本等

离线剖析

使用场景:脚本启动剖析、按期快照保存、剖析远程服务器

Session ID:须要指定id=xxx参数来激活相应的Profiling Settings,此ID显示在Session Settings - Application Settings的左上角,若是配置文件中只包含一个Session,则不须要配置。
配置文件位置:能够指定config=xxx.xml,来指明设置的存放位置,默认是~/.jprofiler7/config.xml
离线剖析命令行样例:
 
相关文章
相关标签/搜索