`
goon
  • 浏览: 183752 次
  • 性别: 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定位问题并解决的过程。 8. **注意事项** - 避免在高负载环境下做内存分析,因为这可能导致分析结果不准确。 -...

    内存泄漏检测工具JProfiler 资料

    2. **对象分配追踪**:JProfiler能追踪对象的创建和分配过程,帮助找出哪些类或方法频繁创建新对象,从而找出可能的内存泄漏源头。 3. **对象持有链分析**:当发现有大量对象无法被垃圾回收时,JProfiler可以展示...

    JProfiler说明文档

    综上所述,JProfiler 9.2提供了一整套全面且深入的性能分析工具,涵盖了内存管理、CPU使用率、线程活动等多个方面,对于Java应用程序的开发和维护具有重要意义。通过对这些功能的灵活运用,开发者能够更加高效地识别...

    Jprofiler JVM不可或缺的内存剖析工具

    1. **实时内存剖析**:JProfiler能够实时显示内存分配情况,包括对象创建、存活周期以及垃圾回收等过程。它提供了堆内存视图,可以查看各个类的实例数量、占用内存大小,以及对象之间的引用关系。 2. **线程分析**...

    jprofiler安装文件

    5. 深度内存分析:通过对象视图和类视图,可以深入查看对象的引用关系,帮助理解内存结构和查找内存泄漏。 6. JMX集成:JProfiler支持JMX(Java Management Extensions),允许开发者监控和管理远程应用服务器的...

    jprofiler监控工具使用说明.rar

    JProfiler是一款强大的Java性能分析和内存监控工具,它能够帮助开发者深入理解Java应用程序的运行情况,找出性能瓶颈并优化代码。本文将详细阐述JProfiler的主要功能、安装过程以及使用技巧,以帮助你充分利用这款...

    JProfiler分析

    JProfiler是一款强大的Java性能分析工具,尤其在理解应用程序的内存消耗、线程行为、CPU使用情况以及方法调用等方面表现出色。它为开发者提供了直观的图形用户界面,使得复杂的性能问题变得易于理解和解决。在本文中...

    JProfiler11

    其强大的heap walker工具可以让你查看不同垃圾回收器状态下的内存分配,通过类视图、对象视图和引用链视图来定位问题。此外,它还可以跟踪对象生命周期,显示对象的创建路径,帮助识别长期存活的对象。 **CPU使用率...

    Jprofiler使用介绍

    在分析过程中,JProfiler会生成大量数据,通过各种过滤机制控制数据流,以适应不同的标准和封装包,同时允许使用灵活的正则表达式模式进行筛选。 JProfiler的主要特性包括: 1. **内存剖析**:内存视图部分提供了...

    jProfiler7 java内存分析 linux版本

    - **堆内存分析**:查看堆内存的使用情况,包括对象数量、总大小等信息,还可以进行垃圾收集后对比分析。 - **对象生存期分析**:跟踪对象的生命周期,识别长期存在的对象,可能就是内存泄漏的源头。 - **内存...

    JProfiler9入门教程

    - **内存管理**:监测堆内存的使用情况和对象实例的数量,帮助定位可能存在的内存泄漏问题。 - **CPU使用率分析**:识别消耗CPU资源较多的方法或代码段,优化程序性能。 - **线程监控**:检查线程的阻塞和死锁状况,...

    jprofiler网上牛人学习实战资料汇总3

    JProfiler是一款强大的Java性能分析工具,它可以帮助开发者深入洞察应用程序的内存使用、CPU消耗、线程状态以及对象生命周期等关键性能指标。以下是对JProfiler各项功能的详细解释: 1. **对象与内存监控**:...

    jprofiler8

    jProfiler支持heap walker,允许开发者深入到堆内存的每一个细节,查看特定类的对象实例,甚至追踪引用链,找出导致内存无法释放的原因。 其次,jProfiler 8在CPU性能分析方面也表现出色。它可以记录和分析应用的...

    jprofiler_windows_9_1_1安装包

    7. **引用分析**: 查找对象间的引用关系,找出为何某些对象无法被垃圾回收。 **CPU性能剖析** 1. **启动会话**: 创建一个新的JProfiler会话,连接到目标Java应用程序。 2. **CPU采样**: 启动CPU采样,JProfiler将...

    Jprofiler性能测试工具以及详细说明

    1. **内存泄漏检测**:通过对象分配视图,可以看到对象的创建和销毁情况,配合弱引用和 finalize 视图,可以定位内存泄漏问题。 2. **CPU热点分析**:CPU视图可以显示调用栈,通过点击方法名可以进一步查看其调用...

    The definitive guide to JProfiler

    - 允许开发者详细查看堆内存的情况,包括对象的引用关系和内存占用情况。 此外,JProfiler还提供了丰富的高级分析功能,如CPU分析视图和内存分析视图,以进一步深化分析结果。它支持在多种IDE中集成,并允许通过...

    jprofiler之如何分析.pdf

    - **查找未释放对象的引用情况**:当发现某个对象应当被释放却未能释放时,可以通过查看哪些实例引用了该对象来定位问题所在。 - **Take Heap Snapshot for Selection**:在“Memory Views”界面中右键选择想要监控...

Global site tag (gtag.js) - Google Analytics