JProfiler 是一个全功能的 Java 剖析工具(profiler),专用于分析 J2SE 和 J2EE 应用程序。它把 CPU 线程和内存的剖析组合在一个强大的应用中。JProfiler 可提供许多 IDE 整合和应用服务器整合用途。
JProfiler 直觉式的 GUI 让你可以找到效能瓶颈、抓出内存泄漏(memory leaks)、并解决线程的问题。它让你得以对 heap walker 作资源回收器的 root analysis,可以轻易找出内存泄漏;heap 快照(snapshot)模式让未被参照(reference)的对象、稍微被参照的对象、或在终结(finalization)队列的对象都会被移除;整合精灵以便剖析浏览器的 Java外挂功能,JProfiler 功能很强大,可以监控普通的 java application, applet, java web start,application server 等。除了可以监控本地的程序,还可以对远程服务器上跑的应用进行监
控。
最新版下载连接 http://www.ej-technologies.com/download/jprofiler/files.php。
当前使用版本为 9.2
windows 下安装,点击 exe 文件进行安装,默认安装即可(也可自己指定安装目录)。linux 下服务端安装,直接解压即可。安装时会自动搜索是否安装过 JDK ,可不必配置.
1、 JProfiler's start center
在安装完毕后打开会有一个页面向导
使用 JProfiler's start center,你可以创建新的会话,编辑已有会话或者打开已保存的会话。
在菜单中选择 start center ,也可以打开这个向导页面、有以下四个标签:Open session、New session、Convert session和 Open snapshot。
我们可以先看第一个1.1 Open session
在 start center 中,打开 Open session标签,在窗口中显示所有预先定义的会话,如上图:
你可以选择一个会话,点击 OK来打开预定义的会话。
会话也可以被修改、复制、删除和排序。
也可以菜单中选择 session --> Open session,打开 Open session窗口。
1.2 New session
会话能够通过两种途径创建:
第一种:人工配置:使用[New session]按钮手工配置一个新的session,配置完成后,开始运行(如何配置详见下面)
第二种:通过集成向导:使用集成向导上的三个按钮:[New server integration] 、[New remote integration] 和 [New applet integration] 。
会话创建完成后可以立即运行。在 Open session标签页中能够看到新建的会话。
1.2.1 New Session(人工配置创建)
点击New Session按钮,显示Application Settings窗体,关于Application Settings配
置,请参见2管理session
此页面也可以在菜单中选择 Session-->New Session,打开 New Session 窗体
1.2.2 New server integration(通过集成向导创建)
点击 New server integration按钮,打开集成向导,引导你将 JProfiler与本地或远程的应用服务器进行集成,步骤:
第一步、选择需要集成的应用服务器。
如果你所使用的应用服务器不在列表中,则选择“Generic application sever ”,并点击“下一步”;如图:
第二步、 选择要集成的应用服务器地址
选择要集成的应用服务器是本地的,还是远程的。如果你选择远程计算机,在选择 的计算机上必须安装 JProfiler ,并选择远程计算机的操作系统,点击 “ 下一步 ” 如图:第三步:选择 JVM提供商,版本和模式(也就是指定jdk的版本)
当你选择 jdk版本时,系统会自动选择推荐的模式
第四步、选择 Jprofiler 启动界面方式。
在开发环境,建立选择第一项,很容易修改监测设置;如果你选择不等待,在启动应用服务器之前要先配置监测设置。VM参数依赖于 JProfiler配置文件的位置;配置文件要与远程计算机上的保持同步。
1、wait for a connection from the Jprofiler GUI : 监控时 tomcat 需要由 JProfiler来启动
2、startup immediately,connect later with the JProfiler GUI: 立即启动,稍后与JProfiler 页面连接
3、profile offline ,JProfiler GUI cannot connect :在脱机情况下,jprofiler gui 无法连接
我选择第一个立即启动稍后连接(有兴趣的可以都尝试一下)
第五步:选择 Tomcat 启动脚本文件路径
第六步:指定JPfrofiler的端口(选择监测的连接端口)
JProfiler GUI 前端通过指定的端口连接被监测的 JVM,默认端口为 8849。请不要选择常用的端口,如 80或 8080。
第七步:检查需求通知
集成向导完成配置,所有必须的信息会进行通知,请检查,点击下一步。如图:
第八步:完成是否立即运行
这里就新建一个session完毕。配置完毕后你会在Open session 中看到你配置的内容
选择启动、因为在第四步中选择了第一种。所以会出现
选择第二个、之后会出现
点击ok、则启动成功了!
这里有个问题。
在第四步中如果选择了第二种。那么无论是tomcat启动没有启动JProfiler都启动不了抛出一个Connection error的错
待排查
而在第四步选择第三种方式时。tomcat有没有启动JProfiler抛上面相同的错误。同上面。
待排查。
1.3 Open snapshot
可以通过打开*.jps文件来打开原来保存过的 session
2 管理 session(不做详解)
2.1 Application settings dialog
这个页面可以是在创建session时管理,也可在open session右键编辑管理(如前面人工配置图片)
session 名称 session类型等根据需要自定义
3、监测视图
3.1 内存视图
JProfiler 的内存视图部分可以提供动态的内存使用状况更新视图和显示关于内存分配状况信息的视图。所有的视图都有几个聚集层并且能够显示现有存在的对象和作为垃圾回收的对象。
3.1.1所有对象(ALL objects)
所有对象视图显示所有加载的类的列表和在堆上分配的实例数。只有 Java 1.5 (JVMTI)才会显示此视图。要查看特定时间段对象的分配,并记录分配的调用堆栈,请使用“记录的对象视图”
有一个集合体等级选择器,你可以在以下几种类型中切换:
在表中显示三行,可以排序
更新频率可以在profiling settings dialog的miscellaneous tab中设置。所有对象视图的更新频率是根据堆上的对象数来自动调整的,如果堆上有太多对象,所有对象视图的计算变得昂贵,所以更新频率会降低。你可以随时刷新以获取最新数据。
你可以在class tracker增加包或类。如果类跟踪器没有记录,则开始记录class tracker 中配置的所有类;如果正在记录不同的对象类型,所以的记录数据被清空
你可以冻结所有的视图让所有的视图对象保持静态
你可以标记当前值并显示差异值。
3.1.2 记录的对象(Recorded objects)
记录的对象视图显示所有已记录对象和数组的列表,包括堆上分配的实例数。只有已记录的对象在此视图中显示。配置记录的细节请参见 memory section overview
如果选择了某个包或类,你可以从记录对象视图跳转到分配调用树和分配热点。方法是右键点击,选择要跳转的视图。
你可以在class tracker增加包或类。如果类跟踪器没有记录,则开始记录class tracker 中配置的所有类;如果正在记录不同的对象类型,所以的记录数据被清空
记录的对象视图可以根据对象的活动状态进行过滤:
右键选择 Change view mode 或者使用 View->Change view mode切换三种模式
你可以标记当前值并显示差异值。
3.1.3 分配调用树(Allocation call tree )
分配调用树视图 显示一棵请求树或者方法、类、包或对已选择类有带注释的分配信息的J2EE组件
3.1.4 分配热点视图(Allocation hot spots view)
分配热点视图显示所选类的对象被分配在哪儿的方法列表。分配到至少占总数 1%的方法才会被显示。方法可以根据active filter sets设置进行过滤。此视图和CPU section 里的hot spots view视图有些类似,只是显示的是分配的类的实例数和数组而不是时间度量
对于每个热点都可以显示它的跟踪记录树。
3.1.5类跟踪(Class tracker)
3.2 堆遍历(Heap Walker)
3.2.1类(Classes)
显示所有类和它们的实例
3.2.2分配(Allocations)
为所有记录对象显示分配树和分配热点
3.2.3索引(References)
为单个对象和“显示到垃圾回收根目录的路径”提供索引图的显示功能。还能提供合并输入视图和输出视图的功能
3.2.4数据(Data)
为单个对象显示实例和类数据
3.2.5时间(Time)
显示一个对已记录对象的解决时间的柱状图
3.3 CPU视图
3.3.1调用树视图(Call tree view)
调用树显示一个线程从上向下调用树。可以根据过滤设置向上或向下过滤显示。
JProfiler自动检测 J2EE组件并在调用树中显示相关的节点。使用不同的图标显示不同的 J2EE组件类型
对于 JSPs 和 EJBs, JProfiler显示名为:
如果 URL可以被细分,每个 URL请求使用一个特殊的符号创建一个新的结点以URL:做前缀,后面跟上细分后的 URL请求
调用树视图集合体等级选择有四种:
调用树不显示 JVM中的所有方法,只显示:
1)节点描述
2)时间范围
3)显示极限
4)百分比计算
名称显示依赖集合体等级:方法、类、包和 J2EE组件
行数在以下情况下会显示:行数显示的是调用(invocation)的行数,还不是方法本身的行数
你可以选择任何一个节点,然后选择 View->Set as root ,将选择的节点改为根节点。如果在 view settings 里,百分比基数设置为“total thread time”,百分比会按照新的根节点重新计算。选择 View->Show all返回所有视图
你可以停止或重启 CPU数据获取来清空调用数,也可以冻结所有视图让调用数保持静态
3.3.2热点视图(Hot spot view)
热点视图显示选择类型的调用列表。截去了占总时间小于 0.1%的点。
热点类型"hot spot type"下拉中可选择,包括两种:
1》方法调用(method calls)
从方法调用中计算显示的热点,被过滤的类计算自己的热点,默认为此模式。
从方法调用中计算显示的热点,被调用的类被加到调用类上,除非是线程实体方法(run和 main 方法)
2》 J2EE 相关的调用
显示的热点为JDBC 调用。需要在profiling settings中设置为可用。
显示的热点为JMS 调用。需要在profiling settings中设置为可用。
显示的热点为JNDI 调用。需要在profiling settings中设置为可用。
显示的热点 URL调用。需要在profiling settings中设置为可用。在profiling settings中,你需要指定是所有的URL都被显示,还是调用一个未过滤类的URL才会被显示,默认为后者。
3.3.3调用图(Call graph)
调用图静态地显示所选择节点计算出线程调用图。节点可以为方法、类、包或 J2EE组件。
计算调用图,点击工具栏中的 Generate graph或者选择 View->Generate graph 。
在图形计算之前,会启动调用图向导。结果图形是静态的,并能够重新计算。调用图向导会记录你最近一次的选项。
调用图向导如下:
第一步:选择图选项(后期补图)
调用图能够为所有线程、一个线程组和单个线程的所有集成等级生成调用图。线程状态选择可以控制在调用图中显示的时间含义。如在线程状态中,选择了 Runnable,在调用图中,Total Time表示的就是线程处于 Runnable的时间。
第二步:选择第一个节点:选择生成调用树的首节点,点击完成,生成调用树。(后期补图)
3.4 线程视图
3.4.1线程历史视图
按照线程开始的顺序显示 JVM中所有线程状态的详细历史信息在视图左手点,线程的名字固定显示,其它部分是滚动度量工具,在水平轴上显示时间。时间轴的开始时间与 JVM的第一个线程的时间保持一致。每个活动的线程用带颜色的线标明,从线程开始到线程结束。颜色标识线程的状态:
绿色表明线程正在运行并能接收 CPU时间。不表明线程正在消耗 CPU时间,只表明线程准备运行并且没有阻塞或睡眠。线程被分配了多少 CPU时间,依赖于不同的其它因素,如总的系统负载,线程优先级和调度的运算法则
橙色表示线程在等待。线程正在睡眠并等待计时器或其它线程唤醒
红色表示线程阻塞。线程尝试进入同步代码区或由其它线程控制的同步方法
亮蓝色表示线程在 Net I/O操作,线程在等待 JAVA库的网络操作完成。在线程监听 socket连接或者等待读写数据到 socket中时,会产生这种状态。
在视图的顶部,有一个线程过滤器,你可以按以下方法进行过滤:
1》活动状态 liveness status
活动的和死线程 Both alive and dead threads
2》名称
在文本框中,你可以输入线程的全名或部分名称进行过滤。也可以使用通配符("*" and "?")选择线程组。可以用逗号隔开多个过滤项进行过滤,如 AWT-, MyThreadGroup-*-Daemon.
线程历史视图有两种显示模式:
此种模式下,时间轴的刻度一直保持不变,如果显示超出屏幕范围,可以使用滚动条查看,如果视图是在自动跟踪模式下,刚总是显示当时时间下的图形。也可以使用 zooming in或 zooming out来调整显示的范围。
此种模式下,在当前视图中会显示整个时间段的图形。Zooming在此模式下不能使用
3.4.2线程监控视图
显示当前运行的线程列表以及相关的时间和状态信息。
显示的六列:
显示线程名称,如果线程没有被特别命名,则使用 JVM提供的名称。想让此视图更加有用,最好将你自己创建的线程使用 setName() 进行命名。
显示与此线程相关的线程组的名称
显示线程开始的时间,时间是根据 JVM中第一个线程创建的时间还计算的。
只有在 view settings设置了显示死线程时才能看到这一列,显示线程死去的时间,或者线程还活着但成为空线程的时间,时间是根据 JVM中第一个线程创建的时间还计算的。
显示线程消耗的 CPU时间
Note: CPU时间一列,只有在profiling settings中的Miscellaneous栏中设置CPU time
type 为Estimated CPU times ,并且当你记录CPU数据时,CPU时间才会被度量,否则CPU时间一栏总是空的。
如果你的系统和 JVM不支持线程特定的 CPU时间报告,这栏也是空的
显示线程的名字和创建此线程的线程组。
显示线程的状态,相当于线程历史视图中的状态报告
如果你监控的是 JAVA1.5或以上版本(JVMTI),在屏幕的上半部分就显示上面的表,屏幕的下半部分显示所选线程的线程创建堆栈跟踪。堆栈跟踪只有线程创建时记录CPU数据才会显示。
3.4.3死锁检测图形
JVM中所有死锁的图形化显示.
正常的状态如果没有死锁,就显示"No deadlocks detected"
死锁根据以下情况进行分析:
死锁检测图形有以下特征:
1》在死锁中的线程以紫色的矩形表示。矩形包括以下信息:
2》在死锁中的监视器以灰色的矩形表示,包括以下信息:
3》监控器的所有权用实线箭头表示。箭头指向从线程到监控器。想要了解详细信息,把鼠标停留到箭头上,可以看到提示窗口
4》导致线程死锁的阻塞原因使用虚线箭头来表示。前头指向从阻塞线程到线程想进行的监控器
3.4.4当前监控使用视图
显示当前等待和阻塞的操作
显示以下 6列:可排序
事件起始时间
事件持续时间,事件必须还在进行中
事件类型, "waiting" 或"blocked"中的一种
在特定的监控实例上识别多个事件的 ID
监控器的类。如果没有 JAVA对象与此监控器相关联,刚显示 [raw monitor]
事件中正在或过去在等待的线程
3.4.5监控使用历史视图
显示监控中等待和阻塞的操作
3.4.6监控使用统计
显示监控使用的统计信息
点击工具栏上的 Calculate statistics,或者选择 View->Calculate statistics。
在统计开始前,会打开一个monitor usage statistics options对话框,统计结果表是静态的,并能重新计算
包级别的统计表包含下面 5列:
1》Monitors/Threads/Classes
在统计对象框中按分组标准显示名称
2》Block count
在此监控组中,阻塞操作的频繁程度
3》Block duration
在此监控组中,所有阻塞操作的累积的待续阻塞时间
4》Wait count
在此监控组中,等待操作的频繁程度
5》Wait duration
在此监控组中,所有等待操作的累积的待续等待时间
3.5 VM遥感监测视图
3.5.1堆(Heap)
显示最大的堆大小以及堆中已使用的和未使用的空间大小。可以显示线性图和区域图
3.5.2对象(Objects)
显示堆上对象的总数,分为数组和非数组。可以显示线性图和区域图
3.5.3垃圾回收(Garbage collector)
显示垃圾回收活动,包括对象释放的一条线和对象移动的一条线。只显示已记录的对象,如果没有记录对象,此视图不可用
3.5.4类(Classes)
显示 JVM调用的类的总,分为过滤类和非过滤类
3.5.5线程(Threads)
显示 JVM中活着的线程总数,分为活动的线程和不活动的线程。
此篇文章写在这里,下一篇文件写如何将JProfiler集成在eclips中