JProfiler jvm性能监控软件使用以及监控思路
.
一、JProfiler 安装 参考https://blog.csdn.net/baidu_19473529/article/details/72724114
二、JProfiler 软解介绍:
Telemetries:遥测 该模块是对应用服务监控数据的一个图表概览
1、 Overview:概览,该以图表形式汇总了当前应用服务器的资源使用情况
2、 Memory:内存占用,统计内存已使用和空闲的空间
3、 Record Objects:堆实例对象记录,以数组和非数组形式来分类记录堆上的对象和数组数量
4、 Record Throughput:对象创建回收记录,记录单位时间间隔内对象创建和回收的数量
5、 GC Activity:垃圾回收,统计垃圾回收率
6、 Classes:类加载数量,分为CPU已加载和CPU未加载
7、 Thread:线程活动状态,线程活动数量
8、 CPU Load:单位时间间隔内CPU的占有率
应用技巧
Memory/Thread/CPU Load比较常用。
- 若运行垃圾回收后,发现Memory还是内存回收不稳定,还是存在蓝色区域持续增高现象,可能系统出现内存泄漏
-
若Thread模块出现多处红色标注的线程阻塞,说明系统有程序比较好使,需排查启用异步执行
Live memory:实时内存视图该模块动态显示对象堆内存的使用情况
1、All Object:所有对象,显示所有加载的类列表和堆上分配的实例数及占用的堆空间,可以安装不同的类型进行查看,例如:类,包,组件
2、Record Object:记录对象,显示所有已记录的类列表,堆上分配的实例数及占用的堆空间,可以按照不同的类型进行查看,例如:类,包,组件。
记录对象和所有对象的区别:记录对象是active,也就是说正在被使用或者已经被使用的对象,所有对象是指加载进来的所有对象。
3、Allocation Call Tree:分配访问树,分配调用树视图,可以根据请求方法,类,包,组件显示
4、Allocation Hot Spots:分配热点,显示所选类的对象被分配在哪儿的方法列表,分配至少占总数的1%才会被显示
5、Class Tracker:类跟踪器,显示类所标记的类或者包的实例随时间的变化
应用技巧
在这里可以查看类或者方法的内存占用情况,若发现某个类或者方法内存占用比较高,或者某段时间占用持续升高,就可以关注这个类或者方法,是不是采用类占用大量内存的手法。
点击【mark current values】可以对当前的监控数据进行标记,褐红色代表内存的占用情况,绿色代表参考时间点。这样就可以观察内存的使用,对象的创建和gc的使用情况等。
点击【mark current values】后,All Object和Record Object会多出一列Difference,该列显示类当前时间对象实例数量较之标记时刻对象实例数量的差值,以数字和百分比显示。
Heap Walker:堆遍历视图 该模块可以明确查看对象的引用关系,常用来查找内存泄漏问题。
当发现某个该释放掉的对象没有释放,就可以看一下哪个实例在引用它,找到了根即找到了溢出点。
例如,在Live Memory视图中发现某个类或者包持续消耗内存不释放,在该类或包上右键选择“show section in Heap Walker”,即可进入堆视图,在该视图查看对象堆内存具体分配情况,已经对象的引用和被引用情况。
CPU views:CPU视图从5个子分析视图共同组成,从不同层面展示类程序对cpu的使用情况
1、Call Tree:以树结构自顶向下显示线程方法调用树已经各个方法对cpu的使用情况
2、Hot Sports:显示消耗内存最多的类型树列表,每个节点显示具体方法占用cpu的比例
3、Call Graph:显示一个从已选方法,类,包或J2EE组件开始的访问队列的图
4、Method Statistics:记录了方法调用的时间细节
5、Call Tracer:记录多线程方法调用的时间顺序
6、JavaScript XHR Origin Tracking:js原始请求追踪,需要借助Google浏览器的扩展插件
应用技巧
观察某个时间段内线程对应cpu的使用情况,如果某个方法对cpu长时间的高频占用,那程序肯定会慢,这时就要检查该方法中是否有什么非常耗时的计算。
Threads:线程视图该模块主要用来监控管理线程的运行状态。
1、Threads History:动态显示线程列表及线程的历史运行状态
绿色:表示线程正在运行并能接受CPU时间
橙色:表示线程正在睡眠等待计时器或者其他线程唤醒
红色:表示线程阻塞
蓝色:表示线程Net I/O操作,线程在等待Java库的网络操作完成,在线程监听socket链接或者等待读写数据到socket中
2、Threads Monitor:显示所有线程的运行列表,包括执行状态,开始时间等
3、Threads Dump:显示所有线程的堆栈跟踪
应用技巧
根据Threads History可以查看当前系统是否有线程堵塞的情况。若存在,只需在当前线程右键选择“show call tree for selected Thread”,在call tree视图查看线程分配调用树以及cpu的占用率,在相关的类方法上右键选择“call graph ”可以直观查看线程调用树并追踪阻塞的方法或者类。
Monitor & locks:锁视图该模块显示类JVM内部锁及监控运行的状态
1、Current Locking Graph:显示JVM当前的锁定情况
2、Current Monitors:显示等待或者阻塞的线程
3、Locking History Graph:显示记录在JVM中锁定历史
4、Monitor History:显示历史等待或者阻塞的线程
5、Monitor Usage Statistics:静态计算统计监控器搜集的数据
应用技巧
通过Current Locking Graph可以很直观的查看当前线程锁定状态及线程和监视器的关系
黄色箭头:线程等待
红色箭头:线程死锁
黑色箭头:指示了监视器对线程的所有权
1、 windows JProfiler 连接到 linux 服务器 dwl项目
日志中出现如下字样,说明连接成功
2、 点击Telementrise àMemory 查看新生代使用情况,是否有大幅度上升以及下降趋势
经查看,系统中新生代内存使用,呈现阶梯式上涨趋势,达到19MB时急速下降(有可能GC造成内存回收导致,待确认)
提出假设,是否有定时任务在自动执行,在不停创造新对象
3、 使用快照进行分析,快照开始时间为 33::53
在进行一次垃圾回后,停止快照,通过此时间段进行分析,下图为新生代垃圾回收情况
回到All Object 视图,查看是否有没有被回收的对象,
如果有,则跟踪这个对象,查看是被哪个。。。。。。。。先写到这