- 浏览: 181284 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
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 4296最经看了一些关于https ... -
eclipse批量转码插件《转》
2013-08-12 17:21 2780插件源代码下载 (导入插件在workspace中,右键exp ... -
XSS漏洞《转》
2013-05-21 14:04 1166XSS 全称(Cross Site Scripting) 跨 ... -
Fiddler导致浏览器无法访问网络
2013-05-07 21:12 9798解决办法: 去掉下图中的两个勾选框 -
博客搬家
2013-02-27 10:36 15博客搬家到csdn,地址: http://blog.csdn. ... -
log4j配置《转》
2011-12-13 09:54 869Log4J的配置文件(Configuration File)就 ... -
url 汉字
2011-10-26 10:08 885url中的参数如果有汉字,需要进行两次encode -
Cassandra数据存储
2011-09-15 15:59 1656版本:0.7.6 客户端:cassandra自带的thrif ... -
hibernate的各种保存方式及其区别《转》
2010-12-25 11:50 913hibernate的保存hibernate对于对象的保存提供了 ... -
没有圣人,更没有罪人
2010-10-15 22:48 929每一个圣人都有过去,每一个罪人都有未来。——巴菲特 -
物联网——中国也在行动
2010-09-20 10:08 911http://portal.vsharing.com/k/ne ... -
普通人为何成不了富翁的原因
2010-09-15 12:49 1024当今世界上, ... -
qq.com怎么会在sina前面??
2010-05-31 09:02 971Google 发布全球 TOP 1000 网站榜单:http: ... -
想不到html5得到支持的速度如此之快啊
2010-04-19 22:47 920html5进展很快,可以尝鲜了。。 -
上海』 [情感浅滩] 老公的酒后真言 让我泪流满面…(转载
2010-04-18 22:58 944http://bbs.city.tianya.cn/new/T ... -
web开发学习笔记
2010-04-11 22:04 10451、mysql分页.MySQL中一般的分页作法大多利用Limi ... -
上海还有段路要走啊----广东3:1上海
2010-04-11 21:39 862还以为今年上海跟广东还有得一拼呢,但是看得出来,跟广东还是有差 ... -
js设为主页和收藏
2010-03-17 23:16 2109加入收藏:onclick="window.exter ...
相关推荐
详细介绍jprofiler安装过程和安装过程会出现的问题以及教你如何获得注册码。安装成功后教你如何使用工具,例如什么情况下表示内存溢出,什么情况下进程死锁,这个工具主要是看那些使用标签。
JProfiler是一个全功能的 Java 剖析工具,JProfiler 直觉式的 GUI 可以让用户通过视觉上的观察就能方便的找到瓶颈和内存漏失等问题。
一本不错的JProfiler使用手册,特点: 1.中文 2.由浅入深 3.图文并茂 4.v4.0
JProfiler 是一个非常优秀的的 JVM 性能分析工具,可监视本地和...1、 监视堆内存占用情况和创建对象实例的数量,找出内存泄露的根源。 2、 监视占用 CPU 较多的方法 3、 监视线程的阻塞与死锁 4、 监视 GC 的耗时。
JProfiler使用完全手册,关于JProfiler软件的详细使用说明资料在网上几乎很难找到,这是其中的一篇,很不错!
jprofiler
本文档详细介绍了Jprofiler9.2各个功能菜单的用途及用法,并结合实际案例使用Jprofiler对项目进行JVM性能分析。
JProfiler使用
jprofiler9+中文使用手册 保证是可以使用版本,请大家放心下载
JProfiler 是一个全功能的Java 剖析工具(profiler ),专用于分析J2SE 和J2EE 应用 程序。它把CPU 线程和内存的剖析组合在一个强大的应用中。JProfiler 可提供许多IDE 整 合和应用服务器整合用途
JProfiler
JProfiler 是一个全功能的Java剖析工具...heap快照(snapshot)模式让未被引用(reference)的对象, 稍微被引用的对象、或在终结(finalization)序列的对象都会被移除;整合精灵以便剖析瀏览器的Java外掛功能
JProfiler使用,使用JProfiler定位程序内存使用及资源使用
包括JProfiler使用手册和JProfiler5.2.1的注册码 注册码保证可用
JProfiler在Linux上的安装和使用
1、监视堆内存占用情况和创建对象实例的数量找出内存泄露。 2、监视占用CPU较多的方法 3、监视线程的阻塞与死锁 4、监视GC的耗时。 监视本地JVM(Windows): 需要安装JProfiler windows版本 监视远程的JVM(Linux):...
中文JPROFILER使用手册,是你学习JROFILER的好帮手.
JProfiler是一款Java的性能监控工具。可以查看当前应用的对象、对象引用、内存、CPU使用情况、线程、线程运行情况(阻塞、等待等),同时可以查找应用内存使用得热点。
实战培训 01:JProfiler监控实例一.pdf
JProfiler 的内存视图部分可以提供动态的内存使用状况更新视图和显示关于内存分配状况信息的视图。所有的视图都有几个聚集层并且能够显示现有存在的对象和作为垃圾回收的对象。 所有对象 显示类或在状况统计和尺码...