性能分析工具JProfile使用指导书
安装JProfile
1.1 在IDEA安装JProfile插件
- 在idea中依次点击File->Setting->Plugins,进入插件页面,搜索JProfile,点击install进行下载安装,成功后重启idea
- 打开idea,看到idea上方有JProfile的图标,表示插件安装成功
1.2 下载安装JProfiler客户端
官网网址:https://www.ej-technologies.com/products/jprofiler/overview.html
需要License
1.3 IDEA配置JProfiler可执行文件
一般来说,IDEA会自动将JProfiler可执行文件的路径加入,如图:
2 监测视图
2.1 JProfiler监测
选择需要监测的项目,点击按钮,就会自动弹出JProfiler窗口,就可以监控自己的代码性能了。
如果代码运行的非常快,会监测不到,可以设置sleep或者通过键盘输入来控制代码运行,观察性能变化。
/**
* 配合性能检测工具Jprofiler使用,键盘控制开始和结束
*/
Scanner in = new Scanner(System.in);
System.out.println("可以开始监测构建网格了吗:");
String a = in.next();
//待监测的运行代码块
System.out.println("可以结束监测了吗:");
String c = in.next();
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
2.2 内存视图(Live memory)
JProfiler 的内存视图部分可以提供动态的内存使用状况更新视图和显示关于内存分配状况信息的视图。所有的视图都有几个聚集层并且能够显示现有存在的对象和作为垃圾回收的对象。
2.2.1 所有对象(ALL objects)
所有对象视图显示所有加载的类的列表和在堆上分配的实例数。
要查看特定时间段对象的分配,并记录分配的调用堆栈,请使用“记录的对象视图”。这里有一个集合体等级选择器,你可以在以下几种类型中切换,如图:
类(classes):每一行显示一个单独的类,这是默认的集合体类型
包(packages):每一行显示一个单独的包,子包不包含在内。在这个集合体等级内,表是树形的。你可以点击树节点,查看其包含的类 ,如图
J2EE 组件( J2EE components):每一行是一个 J2EE 组件。此模式类似类模式中的过滤器,能够让你快速检查应用中加载的 J2EE 组件。
在表中显示三行,可以排序查看。
名字:根据集合体等级的不同,分别显示类、包或 J2EE
实例数:
大小:显示所以分配实际的总大小。只包括相应指针的大小,不包含引用数组和实例的大小。以字节显示。只包括对象数据,不包括类使用的 JVM 大小,也不包含类数据和本地变量大小。
2.2.2 记录的对象(Recorded objects)
记录的对象视图显示所有已记录对象和数组的列表,包括堆上分配的实例数。只有已记录的对象在此视图中显示。如果选择了某个包或类,你可以从记录对象视图跳转到分配调用树和分配热点。方法是右键点击,选择要跳转的视图。
你可以在class tracker增加包或类。如果类跟踪器没有记录,则开始记录class tracker 中配置的所有类;如果正在记录不同的对象类型,所以的记录数据被清空。
记录的对象视图可以根据对象的活动状态进行过滤:
活动对象(Live objects)
只显示当前在内存中的对象
垃圾回收对象(Garbage collected objects)
被显示被回收的对象
活动的和垃圾回收对象(Live and garbage collected objects)
显示所有被创建的对象
2.2.3 分配调用树(Allocation call tree )
分配调用树视图 显示一棵请求树或者方法、类、包或对已选择类有带注释的分配信息的J2EE组件
2.2.4 分配热点视图(Allocation hot spots view)
分配热点视图显示所选类的对象被分配在哪儿的方法列表。分配到至少占总数 1%的方法才会被显示。方法可以根据active filter sets设置进行过滤。此视图和CPU section 里的hot spots view视图有些类似,只是显示的是分配的类的实例数和数组而不是时间度量。
对于每个热点都可以显示它的跟踪记录树。
2.2.5 类跟踪(Class tracker)
对于每个类,都有类跟踪。
2.3 堆遍历(Heap Walker)
2.3.1 类(Classes)
显示所有类和它们的实例
可以按照类加载器来:
2.3.2 分配(Allocations)
为所有记录对象显示分配树和分配热点
2.3.3 索引(References)
为单个对象和“显示到垃圾回收根目录的路径”提供索引图的显示功能。还能提供
合并输入视图和输出视图的功能
2.3.4 数据(Data)
为单个对象显示实例和类数据
2.3.5 时间(Time)
显示一个对已记录对象的解决时间的柱状图
2.4 CPU 视图
2.4.1 调用树视图(Call tree view)
调用树显示一个线程从上向下调用树。可以根据过滤设置向上或向下过滤显示。
JProfiler 自动检测 J2EE 组件并在调用树中显示相关的节点。使用不同的图标显示
不同的 J2EE 组件类型
servlets:黄色倒心形
JSPs:蓝色倒心形
EJBs:红色倒心形
对于 JSPs 和 EJBs, JProfiler 显示名为:
JSPs:JSP 源文件路径
EJBs:EJB 界面名称
如果 URL 可以被细分,每个 URL 请求使用一个特殊的符号创建一个新的结点以URL:做前,后面跟上细分后的 URL 请求
调用树视图集合体等级选择有四种:
方法,也是默认等级。每个节点都是一个方法调用。特殊的 J2EE 组件方法有他们自己的图标和显示名,上面讲到过。真实的类名以方括号括起
类:每个节点是一个单独的类。特殊的 J2EE 组件方法有他们自己的图标和显示名,上面讲到过。真实的类名以方括号括起
包:每个节点是一个单独的包。不包括子包
J2EE 组件:每个节点是一个 J2EE 组件,如果组件有独立的显示名,真实类名省略。
调用树不显示 JVM 中的所有方法,只显示:
未过滤的类:根据你配置的过滤器设置没有过滤的类
未过滤的类的第一级调用: 未过滤的类对过滤的类的第一级调用,对过滤类的深一级的调用不显示。过滤的节点在左上角以红色标记。
线程实体方法: 方法 Runnable.run()和主方法总是被显示的,无论是否过滤
如果在 view settings中设置了percentage bar模式,调用树中的每个节点都会显示一
个百分比条,显示当前节点的内部时间占总时间的百分比,当前节点包括其所有子孙节
点和红色高亮的部分
2.4.2 热点视图(Hot spot view)
热点视图显示选择类型的调用列表。截去了占总时间小于 0.1%的点。
热点类型"hot spot type"下拉中可选择,包括两种:
方法调用(method calls)
method calls (show filtered classes separately) :从方法调用中计算显示的热点,被过滤的类计算自己的热点,默认为此模式。
method calls (add filtered classes to calling class) :从方法调用中计算显示的热点,被调用的类被加到调用类上,除非是线程实体方法(run 和 main 方法)
2.4.3 调用图(Call graph)
调用图静态地显示所选择节点计算出线程调用图。节点可以为方法、类、包或 J2EE
组件。
计算调用图,点击工具栏中的 Generate graph 或者选择 View->Generate graph 。
在图形计算之前,会启动调用图向导。结果图形是静态的,并能够重新计算。调用
图向导会记录你最近一次的选项。
3.结合算法实际运用
3.1内存迅速上涨
一般来说,会关注堆内存,因为内存泄漏主要是在堆中,如果内存的曲线持续高位、持续上升或者在某时刻突然上身,都是认为有问题的。
首先查看Classes页签,查看对象的数量和占用内存情况:
说明:从图上可以看出,char[]和String对象占用内存非常多,所以主要分析这两个对象.另外还有Integer和BigDiecimal,占用也比较高,也需要分析.
然后点击Biggest Objects页签,查看整个堆中的最大对象,看是否是被某个大对象所用:
说明:从图上可以看出,有两个对象占用内存非常多,所以主要分析这两个对象,为什么会占用这么高的内存
展开该树,发现所有的对象被引用在ICMP发现类中:
说明:从这里可以看出,所有的String对象都是被该类所引用,其引用的属性为list,类型是ArrayList。
右键点击该类,选择Use Selected Objects,在弹出界面选择Reference:
看到的数据是25000个小区的信息缓存在list中,然后构建网格时,又存入到新的list中。
- 1