概述

在运行]ava的时候有时候想测试运行时占用内存情况,这时候就需要使用测试工具查看了。在eclipse里面有Eclipse Memory Analyzer tool(MAT)插件可以测试,而在IDEA中也有这么一个插件,就是]Profiler。JProfiler是由ej-technologies公司开发的一款Java应用性能诊断工具。功能强大,但缺点就是收费。

官网下载地址为:https://www.ej-technologies.com/products/jprofiler/overview.html

特点:

使用方便、界面操作友好(简单且强大)对被分析的应用影响小(提供模板)

CPU,Thread,Memory分析功能尤其强大

支持对jdbc,noSql,jsp,servlet,socket等进行分析支持多种模式(离线,在线)的分析

支持监控本地、远程的VM跨平台

拥有多种操作系统的安装版本Windows、Mac OS X、Linux、FreeBSD、Solaris、AX、HP-UX

使用

数据采集方式

JProfier数据采集方式分为两种:Sampling(样本采集)和Instrumentation(重构模式)

Instrumentation

这是]Profiler全功能模式。在class加载之前,JProfier把相关功能代码写入到需要分析的class的bytecode中,对正在运行的jvm有一定影响。

**优点:**功能强大。在此设置中,调用堆栈信息是准确的。

**缺点:**若要分析的class较多,则对应用的性能影响较大,CPU开销可能很高(取决于Fi1ter的控制)。因此使用此模式一般配合Filter使用,只对特定的类或包进行分析

Sampling

类似于样本统计,每隔一定时间(5ms)将每个线程栈中方法栈中的信息统计出来。优点:对CPU的开销非常低,对应用影响小(即使你不配置任何Fi1ter)缺点:一些数据/特性不能提供(例如:方法的调用次数、执行时间)注:JProfiler本身没有指出数据的采集类型,这里的采集类型是针对方法调用的采集类型。因为]Profiler的绝大多数核心功能都依赖方法调用采集的数据,所以可以直接认为是]Profiler的数据采集类型。

遥感监测 Telemetries

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sdj4lncH-1637710523457)(https://gitee.com/lydon/cloudimages/raw/master/images/image-20211123203321640.png]

overview:显示下述的参数的总览。

**Memory(内存):**显示堆栈的使用状况和堆栈尺寸大小活动时间表。
**Recorded Objects(记录的对象):**显示一张关于活动对象与数组的图表的活动时间表。
**Recorded Throughput (记录的生产量):**显示一段时间累计的JVM生产和释放的活动时间表。
**GC Activity(垃圾回收活动):**显示一张关于垃圾回收活动的活动时间表。
**Classes (类):**显示一个与已装载类的图表的活动时间表。
**Threads (线程):**显示一个与动态线程图表的活动时间表。
**CPU Load (CPU负载):**显示一段时间中CPU的负载图表。

内存视图 Live Memory

JProfiler的内存视图部分可以提供动态的内存使用状况更新视图和显示关于内存分配状况信息的视图。所有的视图都有几个聚集层并且能够显示现有存在的对象和作为垃圾回收的对象。

**All Objects (所有对象):**显示类或在状况统计和尺码信息堆上所有对象的包。你可以标记当前值并显示差异值。
**Record Objects (记录对象 ):**显示类或所有已记录对象的包。你可以标记出当前值并且显示差异值。
**Allocation Call Tree (分配访问树):**显示一棵请求树或者方法、类、包或对已选择类有带注释的分配信息的J2EE组件。
**Allocation Hot Spots (分配热点):**显示一个列表,包括方法、类、包或分配已选类的J2EE组件。你可以标注当前值并且显示差异值。对于每个热点都可以显示它的跟踪记录树。
**Class Tracker (类追踪器):**类跟踪视图可以包含任意数量的图表,显示选定的类和包的实例与时间。

分析:内存中的对象的情况

频繁创建的]ava对象:死循环、循环次数过多

存在大的对象:读取文件时,byte[]应该边读边写。->如果长时间不写出的话,导致byte[]过大>存在内存泄漏

堆遍历 heap walker

在JProfiler的堆遍历器(Heap Walker)中,你可以对堆的状况进行快照并且可以通过选择步骤下寻找感兴趣的对象。堆遍历器有五个视图.

**Classes (类 ):**显示所有类和它们的实例,可以右击具体的类"Used Selected Instance"实现进一步跟踪。
**Allocations(分配):**为所有记录对象显示分配树和分配热点。
**References(索引):**为单个对象和“显示到垃圾回收根目录的路径”提供索引图的显示功能。还能提供合并输入视图和输出视图的功能。
**Time(时间):**显示一个对已记录对象的解决时间的柱状图。
**Inspections(检查 ):**显示了一个数量的操作,将分析当前对象集在某种条件下的子集,实质是一个筛选的过程。
-Graph(图表):你需要在references视图和biggest视图手动添加对象到图表,它可以显示对象的传入和传出引用,能方便的找到垃圾收集器根源。

Ps:在工具栏点击"Go To Start"可以使堆内存重新计数,也就是回到初始状态。

如果通过内存视图 Live Memory已经分析出哪个类的对象不能进行垃圾回收,并且有可能导致内存溢出,如果想进一步分析,我们可以在该对象上点击右键,选择Show Selection In Heap Walker,如下图:

之后进行溯源,操作如下:

查看结果,并根据结果去看对应的图表:

以下是图表的展示情况:

cpu视图 cpu views

JProfiler 提供不同的方法来记录访问树以优化性能和细节。线程或者线程组以及线程状况可以被所有的视图选择。所有的视图都可以聚集到方法、类、包或J2EE组件等不同层上。

**Call Tree(访问树):**显示一个积累的自顶向下的树,树中包含所有在JVM中已记录的访问队列。JDBC,JMS和JNDI服务请求都被注释在请求树中。请求树可以根据Servlet和JSP对URL的不同需要进行拆分。

**Hot Spots(热点):**显示消耗时间最多的方法的列表。对每个热点都能够显示回溯树。该热点可以按照方法请求,JDBC,JMS和JNDI服务请求以及按照URL请求来进行计算。

**Call Graph(访问图):**显示一个从已选方法、类、包或J2EE组件开始的访问队列的图。

**Method Statistis(方法统计):**显示一段时间内记录的方法的调用时间细节

具体使用:1、记录方法统计信息

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JKJ8UyZW-1637710523481)(uploadimage-20211123233644420.png)]

2、方法统计

3、具体分析

线程视图 threads

JProfiler通过对线程历史的监控判断其运行状态,并监控是否有线程阻塞产生,还能将一个线程所管理的方法以树状形式呈现。对线程剖析。
**线程历史Thread History:**显示一个与线程活动和线程状态在一起的活动时间表。
**线程监控Thread Monitor:**显示一个列表,包括所有的活动线程以及它们目前的活动状况。
**线程转储Thread Dumps:**显示所有线程的堆栈跟踪。

线程分析主要关心三个方面:
1.web容器的线程最大数。比如:Tomcat的线程容量应该略大于最大并发数。
2.线程阻塞
3.线程死锁

1、查看线程运行情况

2、新建线程dump文件

监视器&锁 Monitors&locks

Current Locking Graph (当前锁定图表):显示JVM中的当前锁定情况。
Current Monitors (当前监视器):显示当前正在等待或阻塞中的线程操作。
Locking History Graph(锁定历史图表):显示记录在JVM中的锁定历史。
Monitor History(监控器历史):显示等待或者阻塞的历史。
Monitor Usage Statistics(监控器使用统计):计算统计监控器监控的数据。

实例一

package com.lydon.test.profiler;import java.util.ArrayList;
import java.util.concurrent.TimeUnit;/*** 功能演示测试* @create 12:19*/
public class JProfilerTest {public static void main(String[] args) {while (true){ArrayList list = new ArrayList();for (int i = 0; i < 500; i++) {Data data = new Data();list.add(data);}try {TimeUnit.MILLISECONDS.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}}}
}
class Data{private int size = 10;private byte[] buffer = new byte[1024 * 1024];//1mbprivate String info = "hello,atguigu";
}

内存在增长,但遇到gc后又降下来了,是个良性的过程,所以正常

实例二

package com.lydon.test.profiler;import java.util.ArrayList;
import java.util.concurrent.TimeUnit;public class MemoryLeak2 {public static void main(String[] args) {while (true) {ArrayList beanList = new ArrayList();for (int i = 0; i < 500; i++) {Bean data = new Bean();data.list.add(new byte[1024 * 10]);//10kbbeanList.add(data);}try {TimeUnit.MILLISECONDS.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}}}}class Bean {int size = 10;String info = "hello,atguigu";
//    static ArrayList list = new ArrayList();//会出现内存泄露的问题ArrayList list = new ArrayList();
}

我们通过JProfiler来看一下,如下:

你可以看到内存一个劲的往上涨,但是就是没有下降的趋势,说明这肯定有问题,过不了多久就会出现OOM,我们来到Live memory中,先标记看一下到底是哪些对象在进行内存增长,等一小下看看会不会触发垃圾回收,如果不触发的话,我们自己来触发垃圾回收,之后观察哪些对象没有被回收掉,如下:

我上面点击了Mark Current,发现有些对象在持续增长,然后点击了一下Run GC,结果如下所示:

可以看出byte[]没有被回收,说明它是有问题的,我们点击Show Selection In Heap Walker,如下:

然后看一下该对象被谁引用,如下:

结果如下:

可以看出byte[]来自于Bean类是的list中,并且这个list是ArrayList类型的静态集合,所以找到了:static ArrayList list = new ArrayList();
发现list是静态的,这不妥,因为我们的目的是while结束之后Bean对象被回收,并且Bena对象中的所有字段都被回收,但是list是静态的,那就是类的,众所周知,类变量随类而生,随类而灭,因此每次我们往list中添加值,都是往同一个list中添加值,这会造成list不断增大,并且不能回收,所以最终会导致OOM

jvm分析工具JProfiler详解相关推荐

  1. jvm分析工具:JProfiler详解

    概述 在运行]ava的时候有时候想测试运行时占用内存情况,这时候就需要使用测试工具查看了.在eclipse里面有Eclipse Memory Analyzer tool(MAT)插件可以测试,而在ID ...

  2. CTF---basecrack---Base编码分析工具安装详解

    CTF-basecrack-Base编码分析工具安装详解 准备工具:Python环境(最新版) 安装详情: 1)首先下载工具,访问网站或者私信我进行工具获取,网站地址:https://github.c ...

  3. Java性能分析神器-JProfiler详解(一)

    前段时间在给公司项目做性能分析,从简单的分析Log(GC log, postgrep log, hibernate statitistic),到通过AOP搜集软件运行数据,再到PET测试,感觉时间花了 ...

  4. 内存分析工具 MAT 详解

    Mat的作用 MAT是Memory Analyzer tool的缩写,是一种快速,功能丰富的Java堆分析工具,能帮助你查找内存泄漏和减少内存消耗.很多情况下,我们需要处理测试提供的hprof文件,分 ...

  5. Go性能分析工具pprof详解

    文章目录 一.什么是pprof 二.怎么使用pprof 1. 工具型应用 2. 服务型应用 三.`pprof`数据分析 CPU Profiling top指令排序展示 web指令生成图示 list指令 ...

  6. JDK自带JVM分析工具详解

    JDK自带JVM分析工具详解 1. JVM分析工具概述 1.1 JVM分析工具简介 1.2 JVM分析工具分类 2. JVM分析工具详解 2.1 idea环境配置 2.2 jps 2.3 jinfo ...

  7. java 生成dump_java dump文件怎么生成和分析-JMAP用法详解

    jmap是java自带的工具 1. 查看整个JVM内存状态 jmap -heap [pid] 2. 查看JVM堆中对象详细占用情况 jmap -histo [pid] 3. 导出整个JVM 中内存信息 ...

  8. 【Android 应用开发】Ubuntu 下 Android Studio 开发工具使用详解 (旧版本 | 仅作参考)

    . 基本上可以导入项目开始使用了 ... . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21035637 ...

  9. 13.4.虚拟化工具--jmap详解

    13.4.虚拟化工具–jmap详解 13.4.1.jmap命令基本概述 13.4.2.命令格式 13.4.3.参数说明 13.4.虚拟化工具–jmap详解 13.4.1.jmap命令基本概述 jmap ...

  10. Java基准测试工具JMH详解

    Java基准测试工具JMH详解 1.JMH概述 1.1 JMH简介 1.2 JMH与JMeter区别 1.3 JMH注解说明 2.JMH验证 2.1 创建项目 2.2 引入依赖 2.3 启动异常解决 ...

最新文章

  1. 换个角度聊系统稳定性建设(2021版)
  2. java http 401_服务器返回HTTP响应代码:401,URL:https
  3. 重磅!UCSF的研究者利用脑机接口首次让患者输出完整句子,展现恢复语言沟通的潜力...
  4. 06.正则表达式基本知识
  5. DL之DNN:利用numpy自定义三层结构+softmax函数建立3层完整神经网络全部代码实现(探究BP神经网络的底层思想)
  6. Newtonsoft.Json(Json.Net)学习笔记
  7. java orm框架什么意思_ORM框架是什么
  8. 3级软件测试试题,软件测试人员(.NET)_3级_操作技能鉴定1.1.3试题单(26页)-原创力文档...
  9. redis linux 运行依赖,在Ubuntu系统下安装Redis Desktop Manager的方法
  10. 数学之美-隐含马尔可夫模型-笔记
  11. [编织消息框架][消息处理模式]管道模式
  12. IIS安装前已经安装了.NET Framework,安装后如何启用.NETFramework
  13. C语言制作小游戏——贪吃蛇
  14. 深度学习教程(9) | AI应用实践策略(下)(吴恩达·完整版)
  15. 怎么把短视频做成表情包?短视频制作gif只需三步
  16. 介词 at on about
  17. 圆圈中间一个乘号:克罗内克积
  18. Mybatis-Plus实现乐观锁配置
  19. Python OCR 识别图片内容
  20. 国网云(华为组件)使用

热门文章

  1. HTML页面跳转的几种方式(重定向)
  2. Linux内存从0到1学习笔记(7.3,用户空间虚拟内存之内存映射)
  3. 360,手机助手的功能,既然有如此二面性?
  4. linux steam安装路径,Ubuntu Kylin 18.04 steam安装及解决方法
  5. 17、【易混淆概念集】第十一章1 项目风险 风险临界值 VS 风险承受力 风险管理流程 风险管理及变更流程 规划风险管理 识别风险
  6. mbot机器人编程课件_mbot机器人教程创客大赛
  7. 《数学建模与数学实验》第5版 插值与拟合 习题7.6
  8. SIP协议详解(二)
  9. hive sql 行列转换
  10. PLC中如何区分源型漏型