`
goon
  • 浏览: 181284 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Jprofiler使用一:查看对象的被引用情况和创建过程

 
阅读更多

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,JMSJNDI服务请求都被注释在请求树中。请求树可以根据ServletJSPURL的不同需要进行拆分。
  • 热点 Hot spots
    显示消耗时间最多的方法的列表。对每个热点都能够显示回溯树。该热点可以按照方法请求,JDBCJMSJNDI服务请求以及按照URL请求来进行计算。
  • 访问图 Call graph
    显示一个从已选方法、类、包或J2EE组件开始的访问队列的图。

4 线程剖析 Thread profiler

对线程剖析,JProfiler提供以下视图:

  • 线程历史 Thread history
    显示一个与线程活动和线程状态在一起的活动时间表。
  • 线程监控 Thread monitor
    显示一个列表,包括所有的活动线程以及它们目前的活动状况。
  • 死锁探测图表 Deadlock Detection
    显示一个包含了所有在JVM里的死锁图表。
  • 目前使用的监测器 Current monitor useage
    显示目前使用的监测器并且包括它们的关联线程。
  • 历史检测记录 History usage history
    显示重大的等待事件和阻塞事件的历史记录。
  • 监测使用状态 Monitor usage statistics
    显示分组监测,线程和监测类的统计监测数据。

5VM 遥感勘测技术 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

package cn.test;

public class TestBean {

String name = "";

}

 

package cn.test;

import java.util.ArrayList;

public class TestMain {

public static ArrayList list = new ArrayList(); //存放对象的容器

public static int counter = 0; //作统计用

}

 

4.建测试用的JSP文件init1.jspinit2.jsp

Init1.jsp(每次执行都创建1万个TestBean对象)

<%@ page language="java" import="cn.test.*" pageEncoding="ISO-8859-1"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<head>

<title>init</title>

</head>

<body><%

for(int i=0;i<10000;i++){

TestBean b = new TestBean();

TestMain.list.add(b);

}

%>

SIZE:<%=TestMain.list.size()%><br/>

counter:<%=TestMain.counter++%>

</body>

</html>

Init2.jspinit1.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可以让我们找到哪些类在调用后没有被释放(很重要!!!)

查看哪些类被发生了变化:

 

红色的变成是发生变化的对象及其数量。

我刚才执行了4init1.jsp1init2.jsp,正好产生了50000TestBean对象,和图示显示的一样。

3. 过一会后,按F4键进行垃圾回收。但回收完成后,这些对象依然存在,说明某些地方对这个类的引用没有被释放!

4. 找出是哪些地方使用了TestBean类,并且没有释放它们

cn.test.TestBean对象上点击右键选择“Take Heap Snapshot for Selection”,观察它的heap

 

下一步:

 

点击“OK”:

在该类中点击右键,在出现的菜单中选择“Use Selected Objects”:

 

出现如下窗口:

 

选择”Allocations”,点击“OK,然后我们要的结果就出来了

 

图中显示调用此类的地方是init1.jspinit2.jsp,并且各自占用的比率都列出来了。

既然问题的所在找出来了,接下来就该去解决问题了!

(五)总结

其实,我们在测试内存占用时还可以另外写一个释放内存的JSP文件来配合测试,会更清楚一些:

Free.sjp

<%@ page language="java" import="java.util.*,cn.test.*" pageEncoding="ISO-8859-1"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<head>

<title>init</title>

</head>

<body>

<%TestMain.list.clear(); %> collection OK!

</body>

</html>

在点击完init1.jspinit2.jsp后,可以看到内存是TestBean对象的数量增加了,然后执行free.sjp,接着再执行F4进行垃圾回收,立刻可以看到TestBean对象被释放掉了。

 

以上为转载,原文地址:http://blog.csdn.net/djy1135/article/details/2304465

----------------------------------------

以下为本人用Jprofiler7 自带的demo Bezier的查找过程:

 

对象PaintedIcon被引用情况:

 

引用过程:

BezierAnim的main方法中:

 final BezierAnim demo = new BezierAnim();
        demo.init();

 

再看 BezierAnim 的init()方法:

 public void init() {
        getContentPane().add(demo = new Demo());
        getContentPane().add("North", new DemoControls(demo));
    }

 

创建了一个DemoControls对象,也就是上图中的bezier.BezierAnim$DemoControls

 

再看DemoControls的初始化函数:

 public DemoControls(Demo demo) {
            this.demo = demo;

            JMenuBar drawMenuBar = new JMenuBar();
            drawMenuBar.setBorder(null);
            JMenuBar fillMenuBar = new JMenuBar();
            fillMenuBar.setBorder(null);

            drawMenu = drawMenuBar.add(new JMenu("Draw Choice"));
            for (int i = 0; i < drawPaints.length; i++) {
                drawIcons[i] = new PaintedIcon(drawPaints[i]);
                drawMI[i] = drawMenu.add(new JMenuItem(drawName[i]));
                drawMI[i].setIcon(drawIcons[i]);
                drawMI[i].addActionListener(this);
            }
            drawMenu.setIcon(drawIcons[1]);

            fillMenu = fillMenuBar.add(new JMenu("Fill Choice"));
            for (int i = 0; i < fillPaints.length; i++) {
                fillIcons[i] = new PaintedIcon(fillPaints[i]);
                fillMI[i] = fillMenu.add(new JMenuItem(fillName[i]));
                fillMI[i].setIcon(fillIcons[i]);
                fillMI[i].addActionListener(this);
            }
            fillMenu.setIcon(fillIcons[fillPaints.length - 1]);

            leakCheckbox = new JCheckBox("Leak memory", demo.leakMemory);
            leakCheckbox.addActionListener(this);
            blockCheckbox = new JCheckBox("Simulate blocking", demo.block);
            blockCheckbox.addActionListener(this);
            longRunningCheckbox = new JCheckBox("Long-running tasks on EDT", demo.longRunning);
            longRunningCheckbox.addActionListener(this);

            Box optionsBox = Box.createVerticalBox();
            optionsBox.add(leakCheckbox);
            optionsBox.add(blockCheckbox);
            optionsBox.add(longRunningCheckbox);

            add(drawMenuBar);
            add(fillMenuBar);
            add(optionsBox);

        }

 

其中fillIcons和drawIcons是DemoControls的两个属性:

PaintedIcon fillIcons[] = new PaintedIcon[fillPaints.length];
        PaintedIcon drawIcons[] = new PaintedIcon[drawPaints.length];

 

到此为止,已经很清楚这些PaintedIcon 对象是怎么一步一步创建出来的,现在又是在被哪些对象引用。

佩服Jprofiler的强大!

  • 大小: 154.4 KB
  • 大小: 62 KB
分享到:
评论

相关推荐

    jprofiler详细使用介绍

    详细介绍jprofiler安装过程和安装过程会出现的问题以及教你如何获得注册码。安装成功后教你如何使用工具,例如什么情况下表示内存溢出,什么情况下进程死锁,这个工具主要是看那些使用标签。

    JProfiler工具使用简介

    JProfiler是一个全功能的 Java 剖析工具,JProfiler 直觉式的 GUI 可以让用户通过视觉上的观察就能方便的找到瓶颈和内存漏失等问题。

    JProfiler使用说明.pdf

    一本不错的JProfiler使用手册,特点: 1.中文 2.由浅入深 3.图文并茂 4.v4.0

    Jprofiler9.2使用手册.pdf

    JProfiler 是一个非常优秀的的 JVM 性能分析工具,可监视本地和...1、 监视堆内存占用情况和创建对象实例的数量,找出内存泄露的根源。 2、 监视占用 CPU 较多的方法 3、 监视线程的阻塞与死锁 4、 监视 GC 的耗时。

    JProfiler使用完全手册

    JProfiler使用完全手册,关于JProfiler软件的详细使用说明资料在网上几乎很难找到,这是其中的一篇,很不错!

    jprofiler

    jprofiler

    Jprofiler9.2使用手册

    本文档详细介绍了Jprofiler9.2各个功能菜单的用途及用法,并结合实际案例使用Jprofiler对项目进行JVM性能分析。

    JProfiler使用-获取方法调用图.pdf

    JProfiler使用

    jprofiler9+中文使用手册

    jprofiler9+中文使用手册 保证是可以使用版本,请大家放心下载

    jprofiler监控工具使用说明

    JProfiler 是一个全功能的Java 剖析工具(profiler ),专用于分析J2SE 和J2EE 应用 程序。它把CPU 线程和内存的剖析组合在一个强大的应用中。JProfiler 可提供许多IDE 整 合和应用服务器整合用途

    JProfiler

    JProfiler

    JProfiler 是一个全功能的Java剖析工具(profiler)

    JProfiler 是一个全功能的Java剖析工具...heap快照(snapshot)模式让未被引用(reference)的对象, 稍微被引用的对象、或在终结(finalization)序列的对象都会被移除;整合精灵以便剖析瀏览器的Java外掛功能

    JProfiler使用

    JProfiler使用,使用JProfiler定位程序内存使用及资源使用

    JProfiler使用手册与JProfiler5.2.1注册码

    包括JProfiler使用手册和JProfiler5.2.1的注册码 注册码保证可用

    JProfiler在Linux上的安装和使用

    JProfiler在Linux上的安装和使用

    JProfiler入门教程

    1、监视堆内存占用情况和创建对象实例的数量找出内存泄露。 2、监视占用CPU较多的方法 3、监视线程的阻塞与死锁 4、监视GC的耗时。 监视本地JVM(Windows): 需要安装JProfiler windows版本 监视远程的JVM(Linux):...

    JPROFILER使用说明

    中文JPROFILER使用手册,是你学习JROFILER的好帮手.

    JProfiler检查内存泄漏

    JProfiler是一款Java的性能监控工具。可以查看当前应用的对象、对象引用、内存、CPU使用情况、线程、线程运行情况(阻塞、等待等),同时可以查找应用内存使用得热点。

    实战培训 01:JProfiler监控实例一.pdf

    实战培训 01:JProfiler监控实例一.pdf

    jprofiler破解版

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

Global site tag (gtag.js) - Google Analytics