- 浏览: 183798 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
kittaaron123:
爱玛,写得很好,最近也想看下这个写个文档 可以借鉴一下
Java NIO——Selector机制解析三(源码分析) -
liaohb:
pollWrapper:保存selector上注册的FD,包括 ...
Java NIO——Selector机制解析三(源码分析) -
wertyliii:
写的很好。。感觉再做点比喻什么的就更好理解了
Java NIO——Selector机制解析三(源码分析)
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
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.jsp、init2.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.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
<%@ 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.jsp或init2.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的强大!
发表评论
-
Https交互流程《转》
2014-02-24 11:14 4337最经看了一些关于https ... -
eclipse批量转码插件《转》
2013-08-12 17:21 2824插件源代码下载 (导入插件在workspace中,右键exp ... -
XSS漏洞《转》
2013-05-21 14:04 1209XSS 全称(Cross Site Scripting) 跨 ... -
Fiddler导致浏览器无法访问网络
2013-05-07 21:12 9882解决办法: 去掉下图中的两个勾选框 -
博客搬家
2013-02-27 10:36 15博客搬家到csdn,地址: http://blog.csdn. ... -
log4j配置《转》
2011-12-13 09:54 916Log4J的配置文件(Configuration File)就 ... -
url 汉字
2011-10-26 10:08 919url中的参数如果有汉字,需要进行两次encode -
Cassandra数据存储
2011-09-15 15:59 1699版本:0.7.6 客户端:cassandra自带的thrif ... -
hibernate的各种保存方式及其区别《转》
2010-12-25 11:50 970hibernate的保存hibernate对于对象的保存提供了 ... -
没有圣人,更没有罪人
2010-10-15 22:48 967每一个圣人都有过去,每一个罪人都有未来。——巴菲特 -
物联网——中国也在行动
2010-09-20 10:08 942http://portal.vsharing.com/k/ne ... -
普通人为何成不了富翁的原因
2010-09-15 12:49 1064当今世界上, ... -
qq.com怎么会在sina前面??
2010-05-31 09:02 995Google 发布全球 TOP 1000 网站榜单:http: ... -
想不到html5得到支持的速度如此之快啊
2010-04-19 22:47 997html5进展很快,可以尝鲜了。。 -
上海』 [情感浅滩] 老公的酒后真言 让我泪流满面…(转载
2010-04-18 22:58 984http://bbs.city.tianya.cn/new/T ... -
web开发学习笔记
2010-04-11 22:04 11051、mysql分页.MySQL中一般的分页作法大多利用Limi ... -
上海还有段路要走啊----广东3:1上海
2010-04-11 21:39 911还以为今年上海跟广东还有得一拼呢,但是看得出来,跟广东还是有差 ... -
js设为主页和收藏
2010-03-17 23:16 2154加入收藏:onclick="window.exter ...
相关推荐
内存泄漏通常发生在不再使用的对象被其他对象引用,导致垃圾收集器无法回收它们。JProfiler的堆遍历器中的**引用图**是查找内存泄漏的关键工具。通过查看对象到垃圾回收根的引用路径,你可以找到哪些对象阻碍了垃圾...
文档中可能包含具体的案例,如一个因未关闭数据库连接导致内存泄漏的问题,详细讲解了使用JProfiler定位问题并解决的过程。 8. **注意事项** - 避免在高负载环境下做内存分析,因为这可能导致分析结果不准确。 -...
2. **对象分配追踪**:JProfiler能追踪对象的创建和分配过程,帮助找出哪些类或方法频繁创建新对象,从而找出可能的内存泄漏源头。 3. **对象持有链分析**:当发现有大量对象无法被垃圾回收时,JProfiler可以展示...
综上所述,JProfiler 9.2提供了一整套全面且深入的性能分析工具,涵盖了内存管理、CPU使用率、线程活动等多个方面,对于Java应用程序的开发和维护具有重要意义。通过对这些功能的灵活运用,开发者能够更加高效地识别...
1. **实时内存剖析**:JProfiler能够实时显示内存分配情况,包括对象创建、存活周期以及垃圾回收等过程。它提供了堆内存视图,可以查看各个类的实例数量、占用内存大小,以及对象之间的引用关系。 2. **线程分析**...
5. 深度内存分析:通过对象视图和类视图,可以深入查看对象的引用关系,帮助理解内存结构和查找内存泄漏。 6. JMX集成:JProfiler支持JMX(Java Management Extensions),允许开发者监控和管理远程应用服务器的...
JProfiler是一款强大的Java性能分析和内存监控工具,它能够帮助开发者深入理解Java应用程序的运行情况,找出性能瓶颈并优化代码。本文将详细阐述JProfiler的主要功能、安装过程以及使用技巧,以帮助你充分利用这款...
JProfiler是一款强大的Java性能分析工具,尤其在理解应用程序的内存消耗、线程行为、CPU使用情况以及方法调用等方面表现出色。它为开发者提供了直观的图形用户界面,使得复杂的性能问题变得易于理解和解决。在本文中...
其强大的heap walker工具可以让你查看不同垃圾回收器状态下的内存分配,通过类视图、对象视图和引用链视图来定位问题。此外,它还可以跟踪对象生命周期,显示对象的创建路径,帮助识别长期存活的对象。 **CPU使用率...
在分析过程中,JProfiler会生成大量数据,通过各种过滤机制控制数据流,以适应不同的标准和封装包,同时允许使用灵活的正则表达式模式进行筛选。 JProfiler的主要特性包括: 1. **内存剖析**:内存视图部分提供了...
- **堆内存分析**:查看堆内存的使用情况,包括对象数量、总大小等信息,还可以进行垃圾收集后对比分析。 - **对象生存期分析**:跟踪对象的生命周期,识别长期存在的对象,可能就是内存泄漏的源头。 - **内存...
- **内存管理**:监测堆内存的使用情况和对象实例的数量,帮助定位可能存在的内存泄漏问题。 - **CPU使用率分析**:识别消耗CPU资源较多的方法或代码段,优化程序性能。 - **线程监控**:检查线程的阻塞和死锁状况,...
JProfiler是一款强大的Java性能分析工具,它可以帮助开发者深入洞察应用程序的内存使用、CPU消耗、线程状态以及对象生命周期等关键性能指标。以下是对JProfiler各项功能的详细解释: 1. **对象与内存监控**:...
jProfiler支持heap walker,允许开发者深入到堆内存的每一个细节,查看特定类的对象实例,甚至追踪引用链,找出导致内存无法释放的原因。 其次,jProfiler 8在CPU性能分析方面也表现出色。它可以记录和分析应用的...
7. **引用分析**: 查找对象间的引用关系,找出为何某些对象无法被垃圾回收。 **CPU性能剖析** 1. **启动会话**: 创建一个新的JProfiler会话,连接到目标Java应用程序。 2. **CPU采样**: 启动CPU采样,JProfiler将...
1. **内存泄漏检测**:通过对象分配视图,可以看到对象的创建和销毁情况,配合弱引用和 finalize 视图,可以定位内存泄漏问题。 2. **CPU热点分析**:CPU视图可以显示调用栈,通过点击方法名可以进一步查看其调用...
- 允许开发者详细查看堆内存的情况,包括对象的引用关系和内存占用情况。 此外,JProfiler还提供了丰富的高级分析功能,如CPU分析视图和内存分析视图,以进一步深化分析结果。它支持在多种IDE中集成,并允许通过...
- **查找未释放对象的引用情况**:当发现某个对象应当被释放却未能释放时,可以通过查看哪些实例引用了该对象来定位问题所在。 - **Take Heap Snapshot for Selection**:在“Memory Views”界面中右键选择想要监控...