开始之前,我问自己,为什么要学习jProfiler?
回答之前先让我们来看看什么是jProfiler:JProfiler是一个商业授权的Java剖析工具,由EJ技术有限公司,针对Java EE和Java SE应用程序开发的。它允许两个内存剖面评估内存使用情况和动态分配泄漏和CPU剖析,以评估线程冲突。JProfiler直觉式的GUI让你可以找到性能瓶颈、抓出内存漏失(memory leaks)、并解决执行绪的问题。[from 百度百科]
简而言之,它能通过评估CPU、内存以及线程来避免内存漏失,是一个性能监测工具。
那我们为何要监控性能呢?
试想,我们发布在服务器上的项目如何测试其健壮性以及可行性?如何做出一个合格放心的产品来?我给出的答案是在负载测试下进行数据收集和数据监控,调整你的代码或者配置使你的项目运行状况达到最优。
jProfiler正是扮演着这样的一个角色,那么对于完全没接触过的人,如何开始?请移步下文。
Step 1,到EJ的项目主页下载最新版的JProfiler。
Step 2,安装之。笔者这里有一个JProfiler7的License Key:L-J7-feng#1000-289nsew356eehq#9163,填写密钥时name和company随便填就好了[分享即是美德]。假如密钥失效,安装后有免费的10天试用期,选中“Evaluation”表示评估试用即可。
Step 3,假设我们是用Eclipse开发的,点击Session→IDE Integrations,选中你的Eclipse版本,点击OK然后按提示操作即可。操作成功后,我们可以在Eclipse看到JProfiler扩展插件如下:
Step 4,让我们来用一个小小的测试例子开启jProfiler之旅,编写程序如下,并运行之。再点击图标启动JProfiler。
package jProfiler; public class Test extends Thread{ public static void main(String[] args) throws InterruptedException { Test t = new Test(); for(int i=1; i<10000; i++) { new HelloWorld(); t.sleep(100); // 休眠100毫秒 } } } class HelloWorld { public HelloWorld() { System.out.println("Hello Jayzee!"); } }
Step 5,jProfiler启动的时候会自动捕获到运行中的J2SE和J2EE程序,如下所示,选中并点击OK(tips:你也可以点"Show Services"进行手动刷新,JProfiler会自动帮你捕获运行中的java程序)。
勾选记录CPU和在启动的时候记录分配情况,其他的默认不动即可。
Step 6,通过上面的操作我们就可以看到JProfiler的监控界面啦
Step 7,关于一些详细使用方法我们在下文中讲解,这一章节的最后有一个小技巧讲给大家。在我们关闭的时候,JProfiler会提示我们要不要保存当前使用的这个session,我们点击保存,以后就可以在Session→Start Center里面直接调用这个session了。
然而实际上记录的这个"Helloworld"的session是不可以运行的,这里只是跟大家讲解一下怎样使用这个技巧而已。
如何让这个Helloworld跑起来?你需要在cmd下用javac命令把Test.java编译成Test.class然后点选上图右上的红框处,然后进行两个配置:1.选中Launch模式并点选Application按钮;2.在Main class选中你编译好的class文件然后逐步按确认。
配置好之后你就可以通说双击这个session来启动啦,效果如下:
假设你手头上有个项目是要发布在tomcat服务器上的,例如笔者手头上的项目名称是DSPMSU_For_Display,tomcat服务器是7.x版本,下面我们讲解如何对这个本地的tomcat7服务器进行监控,细节如下:
点击Session→Integration Wizards→New Server Integration→Apache Tomcat 7.x→On this computer→勾选你的JVM信息→Waif for a connection from the JProfiler GUI(就是由JProfiler帮你启动tomcat)→选着你的startup.bat→保持默认端口8849→启动。
tips:
1. 你在JProfiler中保存的这个session,如果你双击运行它,它的实质也是去调用startup.bat来启动,因此假如你已经手动启用了tomcat然后又在JProfiler启动这个session,这时候就会报错--端口被占用;
2. 监控过程中,假如tomcat意外关闭,这时候会报下面这样一个错误,错误提示你要勾选"Keep VM alive",在Start Center编辑你保存的session→Profiling Settings选项卡→Customize Profiling Settings→Miscellaneous→Keep VM alive即可。
这么强大的一个工具,怎样性能监控呢?这个课题太大,我们把范围缩小一点,如何入门呢?偶然在CSDN上找到一位blogger的博文,里面的“实战”例子绝对可以让你对性能监控有一个直观的认识。
请先花几分钟看看这篇博文:JProfiler学习笔记
.
.
.
.
.
.
.
几分钟很快就过去了,让我们做以下几个总结:
1. 在Memory Views视图里右击相关类,选中Mark Current Values可以标记当前值,方便后续进行比较,注意绿色和红色之分;
标记完之后,通过GUI界面可以很方便的看出值的变化情况
2. 按F4或者点击窗体上面的绿色图标Run GC可以通知JVM进行垃圾回收的动作(只是通知,不是强制回收);
3. 在Memory Views视图里右击相关类,点选Show Selection In Heap Walker可以进行堆内存跟踪;
4. 在Heap Walker视图中右击相关类,点选Used Selected Instances→Allocation Tree可以看到关于该类的调用细节和内存使用情况。
Allocation tree看的是调用树,你也可以根据需要选择其他选项。
模块的介绍主要是对JProfiler的具体功能进行介绍,部分内容参照自博客:JProfiler 解决 Java 服务器的性能跟踪,如果读者英文阅读能力比较强也可以在工具栏上边点击Help,直接阅读英文帮助,下文部分内容亦是参照自英文API。
JProfiler的内存视图部分可以提供动态的内存使用状况更新视图和显示关于内存分配状况信息的视图。所有的视图都有几个聚集层并且能够显示现有存在的对象和作为垃圾回收的对象。
在JProfiler的堆遍历器(Heap Walker)中,你可以对堆的状况进行快照并且可以通过选择步骤下寻找感兴趣的对象。堆遍历器有五个视图:
tips:在工具栏点击"Go To Start"可以使堆内存重新计数,也就是回到初始状态。
JProfiler 提供不同的方法来记录访问树以优化性能和细节。线程或者线程组以及线程状况可以被所有的视图选择。所有的视图都可以聚集到方法、类、包或J2EE组件等不同层上。CPU视图部分包括:
JProfiler通过对线程历史的监控判断其运行状态,并监控是否有线程阻塞产生,还能将一个线程所管理的方法以树状形式呈现。对线程剖析,JProfiler提供以下视图:
JProfiler提供了不同的监控器视图,如下所示:
观察JVM的内部状态,JProfiler提供了不同的遥感勘测视图,如下所示:
Key 1,把目光集中到上图的蓝色部分,可以发现每次内存上升到一个峰值之后便会下跌,这个动作其实就是GC在回收内存,并且上升和回收的幅度大抵相同,如果你发现内存图中可用内存随着时间的流逝一直在上升而没有GC回收的动作,那么你就要怀疑它是否存在着内存泄露了;
Key 2,当你怀疑内存泄露时,可以在Memory Views视图Mark Current Values,然后在一段时间后F4,找出那个没有被释放掉的异常类对其进行深一步的追踪;
Key 3,追踪主要使用Heap Walker的各项功能,各功能具体能做何种分析请复习章节3.1直观认识和3.2.2 堆遍历 Heap Walker。