推荐文章: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 入门教程的更多相关文章

  1. wepack+sass+vue 入门教程(三)

    十一.安装sass文件转换为css需要的相关依赖包 npm install --save-dev sass-loader style-loader css-loader loader的作用是辅助web ...

  2. wepack+sass+vue 入门教程(二)

    六.新建webpack配置文件 webpack.config.js 文件整体框架内容如下,后续会详细说明每个配置项的配置 webpack.config.js直接放在项目demo目录下 module.e ...

  3. wepack+sass+vue 入门教程(一)

    一.安装node.js node.js是基础,必须先安装.而且最新版的node.js,已经集成了npm. 下载地址 node安装,一路按默认即可. 二.全局安装webpack npm install ...

  4. Content Security Policy 入门教程

    阮一峰文章:Content Security Policy 入门教程

  5. gulp详细入门教程

    本文链接:http://www.ydcss.com/archives/18 gulp详细入门教程 简介: gulp是前端开发过程中对代码进行构建的工具,是自动化项目的构建利器:她不仅能对网站资源进行优 ...

  6. UE4新手引导入门教程

    请大家去这个地址下载:file:///D:/UE4%20Doc/虚幻4新手引导入门教程.pdf

  7. ABP(现代ASP.NET样板开发框架)系列之2、ABP入门教程

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之2.ABP入门教程 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)” ...

  8. webpack入门教程之初识loader(二)

    上一节我们学习了webpack的安装和编译,这一节我们来一起学习webpack的加载器和配置文件. 要想让网页看起来绚丽多彩,那么css就是必不可少的一份子.如果想要在应用中增加一个css文件,那么w ...

  9. 转载:TypeScript 简介与《TypeScript 中文入门教程》

    简介 TypeScript是一种由微软开发的自由和开源的编程语言.它是JavaScript的一个超集,而且本质上向这个语言添加了可选的静态类型和基于类的面向对象编程.安德斯·海尔斯伯格,C#的首席架构 ...

随机推荐

  1. apache加载模块的说明

    转: apache加载模块的说明 2017年04月11日 15:23:35 刚子狂想 阅读数:1432   LoadModule auth_basic_module modules/mod_auth_ ...

  2. JS,JQ及时监听input值的变化,MUI的input搜索框里的清除按钮的点击监听事件

    JS: document.getElementById("input对象的ID").addEventListener('input',function(){ console.log ...

  3. Oracle记录-开启与关闭数据库

    1.配置tnsnames.ora/listener.ora #cd /usr/oracle/oracle/product/11.2.0/db_1/network/admin ---切换到安装目录 #v ...

  4. 使用MedleyText与Syncthink自建云笔记

    随着学习加深,做的笔记越来越多,而使用云笔记怕万一平台关闭(如360网盘啥的)还需要导出笔记费时费力,并且多平台兼容性未知.还是自己搭建放心省事. MedleyText介绍 MedleyText为ma ...

  5. Java中 break continue return 的区别

    1.break break :跳出当前循环:但是如果是嵌套循环,则只能跳出当前的这一层循环,只有逐层break才能跳出所有循环: ; i < ; i++) { ) { break; // 在执行 ...

  6. CSS魔法(三)浮动、相对定位、绝对定位

    浮动 为何需要浮动? 浮动float最开始出现的意义是为了让文字环绕图片而已,但人们发现,如果想要三个块级元素并排显示,都给它们加个float来得会比较方便. 浮动问题? 为何要清除浮动? 很多情况下 ...

  7. linux系统--用户和用户组

    一.用户和用户组的概念 用户:使用操作系统的人 用户组:具有相同系统权限的一组用户.在linux系统中可以存在多个用户组 1.1 /etc/group 这里存储当前系统中所有用户组的信息 每一行对应一 ...

  8. 20155313 2016-2017-2 《Java程序设计》第五周学习总结

    20155313 2016-2017-2 <Java程序设计>第五周学习总结 教材内容学习 第八章 异常处理 程序中总有些意想不到的状况所引发的错误,Java中的错误也以对象方式呈现为ja ...

  9. charCodeAt() 和charAt()

    charAt() 方法可返回指定位置的字符. charCodeAt() 方法可返回指定位置的字符的 Unicode 编码.这个返回值是 0 - 65535 之间的整数. 方法 charCodeAt() ...

  10. WARN bzip2.Bzip2Factory: Failed to load/initialize native-bzip2 library system-native, will use pure-Java version

    [root@hdp2 /root]#hadoop checknative -a 18/12/09 00:31:19 WARN bzip2.Bzip2Factory: Failed to load/in ...