JProfiler 入门教程
推荐文章:JProfiler 入门教程
一、安装JProfiler
从http://www.ej-technologies.com/下载5.1.2并申请试用序列号
二、主要功能简介
1.内存剖析 Memory profiler
JProfiler 的内存视图部分可以提供动态的内存使用状况更新视图和显示关于内存分配状况信息的视图。所有的视图都有几个聚集层并且能够显示现有存在的对象和作为垃圾回收的对象。
- 所有对象
显示类或在状况统计和尺码信息堆上所有对象的包。你可以标记当前值并显示差异值。 - 记录对象 Record objects
显示类或所有已记录对象的包。你可以标记出当前值并且显示差异值。 - 分配访问树 Allocation call tree
显示一棵请求树或者方法、类、包或对已选择类有带注释的分配信息的J2EE组件。 - 分配热点 Allocation hot spots
显示一个列表,包括方法、类、包或分配已选类的J2EE组件。你可以标注当前值并且显示差异值。对于每个热点都可以显示它的跟踪记录树。
2.堆遍历 Heap walker
在JProfiler的堆遍历器(Heap walker)中,你可以对堆的状况进行快照并且可以通过选择步骤下寻找感兴趣的对象。堆遍历器有五个视图:
- 类 Classes
显示所有类和它们的实例。 - 分配 Allocations
为所有记录对象显示分配树和分配热点。 - 索引 References
为单个对象和“显示到垃圾回收根目录的路径”提供索引图的显示功能。还能提供合并输入视图和输出视图的功能。 - 数据 Data
为单个对象显示实例和类数据。 - 时间 Time
显示一个对已记录对象的解决时间的柱状图。
3. CPU 剖析 CPU profiler
JProfiler 提供不同的方法来记录访问树以优化性能和细节。线程或者线程组以及线程状况可以被所有的视图选择。所有的视图都可以聚集到方法、类、包或J2EE组件等不同层上。CPU视图部分包括:
- 访问树 Call tree
显示一个积累的自顶向下的树,树中包含所有在JVM中已记录的访问队列。JDBC,JMS和JNDI服务请求都被注释在请求树中。请求树可以根据Servlet和JSP对URL的不同需要进行拆分。 - 热点 Hot spots
显示消耗时间最多的方法的列表。对每个热点都能够显示回溯树。该热点可以按照方法请求,JDBC,JMS和JNDI服务请求以及按照URL请求来进行计算。 - 访问图 Call graph
显示一个从已选方法、类、包或J2EE组件开始的访问队列的图。
4. 线程剖析 Thread profiler
对线程剖析,JProfiler提供以下视图:
- 线程历史 Thread history
显示一个与线程活动和线程状态在一起的活动时间表。 - 线程监控 Thread monitor
显示一个列表,包括所有的活动线程以及它们目前的活动状况。 - 死锁探测图表 Deadlock Detection
显示一个包含了所有在JVM里的死锁图表。 - 目前使用的监测器 Current monitor useage
显示目前使用的监测器并且包括它们的关联线程。 - 历史检测记录 History usage history
显示重大的等待事件和阻塞事件的历史记录。 - 监测使用状态 Monitor usage statistics
显示分组监测,线程和监测类的统计监测数据。
5.VM 遥感勘测技术 VM telemetry
观察JVM的内部状态,JProfiler提供了不同的遥感勘测视图,如下所示:
- 堆 Heap
显示一个堆的使用状况和堆尺寸大小活动时间表。 - 记录的对象 Recorded objects
显示一张关于活动对象与数组的图表的活动时间表。 - 垃圾回收 Garbage collector
显示一张关于垃圾回收活动的活动时间表。 - 类 Classes
显示一个与已装载类的图表的活动时间表。 - 线程 Threads
显示一个与动态线程图表的活动时间表。
三、实战
(一)任务目标
找出项目中内存增大的原因
(二)配置说明
操作系统:Windows2003
Web容器:Tomcat5.0.23
JDK版本:sun1.4.2
监控类型:本地
Jprofiler安装路径:D:/jprofiler5
Tomcat安装路径:D:/Tomcat5
(三) 测试项目
1. 新建WEB项目test
2. 建包cn.test
3. 在该包下建类文件TestMain.java 和 TestBean.java
1 package cn.test;
2
3 public class TestBean {
4
5 String name = "";
6
7 }
8
9 package cn.test;
10
11 import java.util.ArrayList;
12
13 publicclass TestMain {
14
15 publicstatic ArrayList list = new ArrayList(); //存放对象的容器
16
17 public static int counter = 0; //作统计用
18
19 }
20
4.建测试用的JSP文件init1.jsp、init2.jsp
Init1.jsp(每次执行都创建1万个TestBean对象)
1 <%@ page language="java" import="cn.test.*" pageEncoding="ISO-8859-1"%>
2
3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
4
5 <html>
6
7 <head>
8
9 <title>init</title>
10
11 </head>
12
13 <body><%
14
15 for(int i=0;i<10000;i++){
16
17 TestBean b = new TestBean();
18
19 TestMain.list.add(b);
20
21 }
22
23 %>
24
25 SIZE:<%=TestMain.list.size()%><br/>
26
27 counter:<%=TestMain.counter++%>
28
29 </body>
30
31 </html>
32
Init2.jsp和init1.jsp一模一样即可(后面有用)。
(四) 配置测试用例
1. 点击d:/jprofiler5/bin/jprofiler.exe
2. 执行菜单SessionàIntegration WizardsàNew ServerIntegration
选择是本地测试还是远程测试:
选择tomcat运行的脚本文件:
选择虚拟机的类型:
选择监控端口:
用默认的即可
选择Web容器是否和Jprofiler一起运行:
默认即可
配置提示:
在“远程控制”的时侯要仔细阅读一下。
然后选择立即起动,开始运行。
点击“OK”,我们可以看到另外一个小窗口出来了:
Jprofiler的窗口为:
这样我们就可以进行监控了!
(五) 开始测试
1. 在IE地址栏中输入:http://localhost/test/init1.jsp,执行一次,我们可以在内存视图中看到cn.test.TestBean对象被创建了10000次:
2.标记现在的状态,然后再执行init1.jsp和,init2.jsp可以让我们找到哪些类在调用后没有被释放(很重要!!!)
查看哪些类被发生了变化:
红色的变成是发生变化的对象及其数量。
我刚才执行了4次init1.jsp和1次init2.jsp,正好产生了50000个TestBean对象,和图示显示的一样。
3. 过一会后,按F4键进行垃圾回收。但回收完成后,这些对象依然存在,说明某些地方对这个类的引用没有被释放!
4. 找出是哪些地方使用了TestBean类,并且没有释放它们
在cn.test.TestBean对象上点击右键选择“Take Heap Snapshot for Selection”,观察它的heap
下一步:
点击“OK”:
在该类中点击右键,在出现的菜单中选择“Use Selected Objects”:
出现如下窗口:
选择”Allocations”,点击“OK”,然后我们要的结果就出来了
图中显示调用此类的地方是init1.jsp和init2.jsp,并且各自占用的比率都列出来了。
既然问题的所在找出来了,接下来就该去解决问题了!
(五)总结
其实,我们在测试内存占用时还可以另外写一个释放内存的JSP文件来配合测试,会更清楚一些:
Free.sjp
1 <%@ page language="java" import="java.util.*,cn.test.*" pageEncoding="ISO-8859-1"%>
2
3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
4
5 <html>
6
7 <head>
8
9 <title>init</title>
10
11 </head>
12
13 <body>
14
15 <%TestMain.list.clear(); %> collection OK!
16
17 </body>
18
19 </html>
20
在点击完init1.jsp或init2.jsp后,可以看到内存是TestBean对象的数量增加了,然后执行free.sjp,接着再执行F4进行垃圾回收,立刻可以看到TestBean对象被释放掉了。
参考文档地址:
http://www.blogjava.net/anymobile/articles/28248.html
相关文章:
http://wenku.baidu.com/view/78183603eff9aef8941e0631.html
http://wenku.baidu.com/view/120aa342336c1eb91a375d7c.html
http://www.blogjava.net/ddpie/archive/2007/05/14/117450.html
JProfiler 入门教程的更多相关文章
- wepack+sass+vue 入门教程(三)
十一.安装sass文件转换为css需要的相关依赖包 npm install --save-dev sass-loader style-loader css-loader loader的作用是辅助web ...
- wepack+sass+vue 入门教程(二)
六.新建webpack配置文件 webpack.config.js 文件整体框架内容如下,后续会详细说明每个配置项的配置 webpack.config.js直接放在项目demo目录下 module.e ...
- wepack+sass+vue 入门教程(一)
一.安装node.js node.js是基础,必须先安装.而且最新版的node.js,已经集成了npm. 下载地址 node安装,一路按默认即可. 二.全局安装webpack npm install ...
- Content Security Policy 入门教程
阮一峰文章:Content Security Policy 入门教程
- gulp详细入门教程
本文链接:http://www.ydcss.com/archives/18 gulp详细入门教程 简介: gulp是前端开发过程中对代码进行构建的工具,是自动化项目的构建利器:她不仅能对网站资源进行优 ...
- UE4新手引导入门教程
请大家去这个地址下载:file:///D:/UE4%20Doc/虚幻4新手引导入门教程.pdf
- ABP(现代ASP.NET样板开发框架)系列之2、ABP入门教程
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之2.ABP入门教程 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)” ...
- webpack入门教程之初识loader(二)
上一节我们学习了webpack的安装和编译,这一节我们来一起学习webpack的加载器和配置文件. 要想让网页看起来绚丽多彩,那么css就是必不可少的一份子.如果想要在应用中增加一个css文件,那么w ...
- 转载:TypeScript 简介与《TypeScript 中文入门教程》
简介 TypeScript是一种由微软开发的自由和开源的编程语言.它是JavaScript的一个超集,而且本质上向这个语言添加了可选的静态类型和基于类的面向对象编程.安德斯·海尔斯伯格,C#的首席架构 ...
随机推荐
- Jenkins插件安装实战篇
Jenkins插件安装实战篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 上篇博客我介绍了Jenkins是啥,以及持续集成,持续交付,持续部署的概念,那么问题来了:你知道CI和C ...
- parted分区工具用法
parted分区工具用法 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 随着生产环境中数据量的增大,我们对硬盘的容量也有很大的需求,当硬盘的容量大于2T(工业上的最大磁盘2.2TB ...
- FastDFS与Nginx的搭建及遇到的问题
1.1 FastDFS与Nginx的搭建 可以使用一台虚拟机来模拟,只有一个Tracker.一个Storage服务. 配置nginx访问图片. 1.1.1 搭建步骤 第一步:把fastDFS需要 ...
- SPOJ 839 OPTM - Optimal Marks (最小割)(权值扩大,灵活应用除和取模)
http://www.spoj.com/problems/OPTM/ 题意: 给出一张图,点有点权,边有边权 定义一条边的权值为其连接两点的异或和 定义一张图的权值为所有边的权值之和 已知部分点的点权 ...
- 03-Windows Server 2016 IIS的安装与配置
1. 打开服务器管理器,点击[添加角色和功能选项]. 2. 进入“添加角色和功能向导”页面,点击下一步. 3. 安装类型选择[基于角色或基于功能的安装],点击下一步. 4. 进入服务器选 ...
- centos7 cannot find a valid baseurl for repo
出现这个问题是因为yum在安装包的过程中,虽然已经联网,但是没法解析远程包管理库对应的域名,所以我们只需要在网络配置中添加上DNS对应的ip地址即可. 操作 1.打开网络配置文件 vi /etc/sy ...
- Linux 4.10.8 根文件系统制作(二)---制作jiffs文件系统
一.制作jiffs文件系统 制作jffs2 文件系统需要用到 mkfs.jffs2工具. 执行命令: mkfs.jffs2 -n -s 0x800 -e 0x20000 --pad=0x800000 ...
- logback配置按天产生日志文件
1 依赖Jar包 pom配置 也可以根据自己的版本来 <dependency> <groupId>org.slf4j</groupId> <artifactI ...
- linux C sscanf()函数
linux sscanf() 类似正则表达式,又不完全是正则表达式. 分割 ”/“ 或 "@" 或空格 要用 [^/] 例如: sscanf("iios/12DDWDFF ...
- Maven继承
继承为了消除重复,可以把pom 中很多相同的配置提取出来:如:grouptId, version 等. 在使用的时候子工程直接继承父工程的依赖版本号,子工程中不再需要指定具体版本号,方便统一管控项目的 ...