常用 Java Profiling 工具的分析与对比
- 格式:doc
- 大小:152.50 KB
- 文档页数:9
Java中的GUI框架对比选择最适合你的工具Java作为一种广泛使用的编程语言,提供了多种GUI框架供开发者选择。
这些框架各有特点和适用场景。
本文将对Java中常用的几个GUI框架进行对比,帮助你选择最适合你的工具。
一、SwingSwing是Java提供的最基本和最常用的GUI框架之一。
它提供了丰富的组件和布局管理器,可以轻松地创建各种复杂的用户界面。
Swing 的优点在于易学易用,它提供了大量的文档和示例程序,帮助开发者快速掌握和应用。
然而,Swing也有其局限性。
它的外观默认较为简陋,需要额外的工作来美化界面。
而且,在处理大量数据时,Swing的性能可能会受到影响。
因此,如果你需要创建高度定制化的用户界面或者处理大量数据,或许有其他更适合的选择。
二、JavaFXJavaFX是Oracle在Java 8中引入的新一代GUI框架。
相比于Swing,JavaFX提供了更现代化,更美观的用户界面设计。
它支持页面式布局,可以使用CSS进行界面样式的定制,同时还提供了丰富的动画和多媒体支持。
JavaFX还具有良好的跨平台性能,可以在不同操作系统下获得一致的用户体验。
它也能很好地集成到现有的Swing应用程序中,方便开发者逐步迁移。
然而,JavaFX在一些细节上还不够完善,文档和示例相对较少,对于初学者来说学习曲线可能较陡峭。
此外,JavaFX在某些方面的功能支持可能不及Swing,尤其是在一些特殊需求的场景下。
三、AWTAWT是Java最早提供的GUI框架,它直接使用了底层操作系统的原生组件。
AWT的优点在于性能较高,因为它充分利用了底层操作系统的原生支持。
然而,AWT的外观和功能相对较为有限,对于一些复杂的界面和布局需求,可能支持不够理想。
另外,AWT仅支持部分平台,可能存在跨平台性能方面的问题。
四、Java SWTSWT是一种由Eclipse基金会开发并维护的GUI框架。
它利用了操作系统的底层图形系统,提供了更接近原生的界面和更好的性能。
performance profiling and analysis工具1. 引言1.1 概述在软件开发过程中,性能优化是一项至关重要的工作。
随着复杂性和规模不断增长的应用程序,我们需要一种可靠的方式来识别和解决潜在的性能问题。
performance profiling and analysis工具就是为了满足这个需求而诞生的。
Performance profiling and analysis工具可以帮助开发人员分析应用程序在执行时的性能表现,并对潜在的性能瓶颈进行定位和优化。
它们可以提供有关应用程序在CPU、内存、网络等方面的使用情况的详细信息,从而帮助开发人员找出可能造成性能问题的代码或操作。
1.2 文章结构本文将首先对performance profiling and analysis工具进行总体概述,包括其定义和作用,以及常见的工具类型。
然后,我们会详细介绍performance profiling工具和performance analysis工具两个方面。
Performance profiling工具部分将涉及CPU profiling工具、memory profiling工具和network profiling工具,讨论它们分别如何帮助开发人员定位和解决与CPU、内存和网络相关的性能问题。
Performance analysis工具部分将探讨数据收集与处理工具、可视化分析工具以及自动化性能测试与分析工具的功能和用法。
这些工具将帮助开发人员更好地理解和分析所收集到的性能数据,从而对性能问题进行更深入的研究和优化。
1.3 目的本文旨在提供关于performance profiling and analysis工具的全面介绍和详细解释。
通过阅读本文,读者将了解这些工具在软件开发中的重要性,并学会如何选择、使用和理解它们。
此外,本文还将讨论performance profiling and analysis工具的未来发展方向,以便读者对该领域的最新趋势有所了解。
Java性能监控:使用JProfiler或VisualVM等工具进行性能监控引言:在开发和部署Java应用程序时,性能是一个至关重要的方面。
优化应用程序的性能可以提高用户体验,减少资源消耗,并确保应用程序能够在高负载下正常运行。
为了实现这一目标,开发人员需要使用专业的性能监控工具来分析和优化应用程序的性能。
本文将介绍两种常用的Java性能监控工具:JProfiler和VisualVM,并探讨它们的使用方法和优势。
一、JProfilerJProfiler是一款功能强大的Java性能分析工具,它提供了丰富的功能和直观的界面,可以帮助开发人员深入了解应用程序的性能瓶颈,并提供相应的优化建议。
下面将介绍JProfiler的使用步骤:1. 安装和配置:首先,我们需要下载并安装JProfiler。
安装完成后,打开JProfiler并创建一个新的会话。
在会话配置中,选择要监控的Java进程,并设置相关的参数,如端口号和采样频率。
2. 启动监控:配置完成后,点击“开始监控”按钮,JProfiler将连接到目标Java进程,并开始收集性能数据。
在监控过程中,我们可以实时查看应用程序的CPU使用率、内存使用情况、线程状态等信息。
3. 分析性能数据:当我们收集到足够的性能数据后,可以使用JProfiler的分析工具来深入分析应用程序的性能问题。
例如,我们可以查看方法调用的耗时、内存分配的情况以及线程之间的竞争情况。
通过这些数据,我们可以找到性能瓶颈,并进行相应的优化。
4. 优化建议:在分析性能数据的过程中,JProfiler会根据收集到的数据提供相应的优化建议。
这些建议可以帮助开发人员识别潜在的性能问题,并提供相应的解决方案。
例如,JProfiler可能建议我们使用更高效的数据结构、减少内存分配或者优化数据库查询等。
二、VisualVMVisualVM是一款免费的Java性能监控和分析工具,它是基于Java技术的,可以与任何支持Java虚拟机诊断引擎(JVM TI)的Java应用程序进行交互。
java 实现高效文件对比的方法文件对比是指比较两个文件的内容是否一致或者不一致。
在实际应用中,文件对比是一项非常重要的任务,比如在软件开发中,需要对比两个版本之间的代码文件,以查找差异和变动。
本文将介绍几种高效实现文件对比的方法。
一、基于哈希算法的文件对比哈希算法是一种将任意长度的数据映射成固定长度的唯一标识的算法。
在文件对比中,可以使用哈希算法生成文件的哈希值,然后比较两个文件的哈希值是否相等,判断文件内容是否一致。
常用的哈希算法有MD5、SHA-1和SHA-256等。
在Java中,可以使用Java提供的MessageDigest类实现对文件的哈希计算。
以下是一个示例代码:```javaimport java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.security.DigestInputStream;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException; public class FileComparator {public static void main(String[] args) { String file1 = "file1.txt";String file2 = "file2.txt";try {String hash1 = getFileHash(file1);String hash2 = getFileHash(file2);if (hash1.equals(hash2)) {System.out.println("文件内容一致");} else {System.out.println("文件内容不一致");}} catch (NoSuchAlgorithmException | IOException e) {e.printStackTrace();}}public static String getFileHash(String fileName) throws NoSuchAlgorithmException, IOException {MessageDigest digest = MessageDigest.getInstance("MD5");FileInputStream fis = new FileInputStream(newFile(fileName));DigestInputStream dis = new DigestInputStream(fis, digest);byte[] buffer = new byte[8192];while (dis.read(buffer) != -1) ;byte[] md5Bytes = digest.digest();StringBuilder sb = new StringBuilder();for (byte b : md5Bytes) {sb.append(Integer.toString((b & 0xff) + 0x100,16).substring(1));}fis.close();dis.close();return sb.toString();}}```以上代码中,getFileHash方法使用MD5算法计算文件的哈希值,并返回字符串形式的哈希值。
Java性能分析神器-JProfiler详解(转)前段时间在给公司项⽬做性能分析,从简单的分析Log(GC log, postgrep log, statitistic),到通过AOP搜集软件运⾏数据,再到PET,感觉时间花了不少,性能也有⼀定的提升,但总感觉像是⼯作在原始时代,⽆法简单顺畅,⼜⽆⽐清晰的获得想要的结果。
遂花费了⼀定的时间,从新梳理学习了⼀下之前⽤过的关于jvm调优和内存分析的各种⼯具,包括JDK⾃带的jps, jstack, jmap, jconsole,以及IBM的HeapAnalyzer等,这些⼯具虽然提供了不少功能,但其可⽤度,便捷度,远没达到IntelliJ之于开发那种地步。
在偶然情况下,在云栖社区上发现有⼈推荐Jprofiler,装上使⽤版⼀⽤,发现果然是神器,特此推荐给⼤家。
先声明,这个软件是商⽤的,⽹上有很多关于lisence的帖⼦,我这⾥转发,但是绝不推荐⼤家⽤破解版!L-Larry_Lau@#36573-fdkscp15axjj6#25257L-Larry_Lau@#5481-ucjn4a16rvd98#6038L-Larry_Lau@#99016-hli5ay1ylizjj#27215L-Larry_Lau@#40775-3wle0g1uin5c1#0674L-Larry_Lau@#7009-14frku31ynzpfr#20176L-Larry_Lau@#49604-1jfe58we9gyb6#5814L-Larry_Lau@#25531-1qcev4yintqkj#23927L-Larry_Lau@#96496-1qsu1lb1jz7g8w#23479L-Larry_Lau@#20948-11amlvg181cw0p#171159然后,先转⼀篇云栖上的⽂章,然后再慢慢开始我们的Jprofiler之旅。
⼀.JProfiler是什么JProfiler是由ej-technologies GmbH公司开发的⼀款性能瓶颈分析⼯具(该公司还开发部署⼯具)。
0. 文档说明 (3)1. 使用OProfile进行性能分析 (3)1.1 OProfile的简介 (3)1.1.1 使用OProfile的动机和约束 (3)1.1.2 使用OProfile的系统需求 (4)1.1.3 其他关于OProfile的可用资源 (5)1.1.4 安装OProfile (5)1.2 Oprofile概述 (6)1.2.1 开始 (6)1.2.2 工具小节 (6)1.3 控制Profiler (7)1.3.1 使用opcontrol (7)1.3.2 使用oprof_start (10)1.3.3 配置细节 (10)1.4 获得结果 (11)1.4.1 Profile Specification (11)1.4.2. 镜像与符号的结果汇总(使用opreport) (14)1.4.3 输出带标注的源码 (18)1.4.4 gprof兼容的输出 (20)1.4.5 档案管理 (20)1.5 理解profiling结果 (21)1.5.1 中断延迟的profiling (21)1.5.2 内核的profiling (22)1.5.3 解释callgraph的profiles (22)1.5.4 非精确的带标注的源码 (22)1.5.5 汇编函数 (24)1.6 使用OProfile的实际例子 (24)1.6.1 ctpl的性能分析 (24)1.7 OProfile的cons 与pros (29)1.7.1 OProfile的主要优点 (29)1.7.2 OProfile的主要缺点 (29)1.7.3 适合使用OProfile的场合 (30)1.8 OProfile的其他参考资料 (30)2. 使用Intel VTune TM进行性能分析 (30)2.1 Intel VTune TM简介 (30)2.1.1 VTune的功能与适用范围 (31)2.1.2 VTune的系统需求 (31)2.1.3 其他可用的VTune资源 (31)2.1.4 VTune的安装与部署 (31)2.2 VTune中的有关性能调优的名词与术语 (31)2.2.1 Data Collector (31)2.2.2 Project与Activity (31)2.2.3 Drilling Down (32)2.3 使用VTune收集与分析性能数据 (32)2.3.1 使用API收集数据 (32)2.3.2 远程收集数据 (32)2.3.3 使用采样 (32)2.3.4 使用callgraph分析 (32)2.3.5 静态模块分析 (32)2.3.6 查看带Profiling信息的源码 (32)2.3.7 使用Event Ratios (32)2.4 高级用法 (32)2.4.1 使用Tuning Assistant (32)2.4.2 合并activities (32)2.5 使用VTune进行性能分析的实际例子 (32)2.5.1 iknow的fbsmon模块64位升级 (32)2.5.2 使用VTune对ctpl进行性能分析 (32)2.6 VTune的cons与pros (32)2.6.1 VTune的主要优点 (33)2.6.2 VTune的主要缺点 (33)2.6.3 适合使用VTune的场合 (33)2.7 其他可以与VTune协同工作的工具 (33)2.7.1 Intel Thread Profiler (33)3. ANNEX (34)0. 文档说明本文的目标在于:a)详细描述两种主要的Profiling工具的用法。
java 对象修改前后对比工具类-回复Java对象修改前后对比工具类一、引言在Java开发中,经常需要比较两个对象的差异,并以可读性强的格式展示这些差异。
针对这种需求,开发一个对象修改前后对比工具类是非常有意义和必要的。
本文将介绍如何一步一步地开发一个Java对象修改前后对比工具类,以帮助开发者更好地理解和使用这个工具。
二、实现思路开发一个对象修改前后对比工具类,可以按照以下步骤进行:1. 定义工具类首先,我们需要定义一个工具类,用于保存对象之间的差异信息,并提供一些方法来处理和展示这些差异。
我们可以将这个工具类命名为"ObjectDiffs"。
2. 定义对象差异信息类在"ObjectDiffs"工具类中,我们需要定义一个对象差异信息类,用于保存对象之间的差异信息。
这个类可以包含两个字段,分别表示修改前和修改后的对象。
3. 定义对象对比方法在"ObjectDiffs"工具类中,我们需要定义一个方法,用于比较两个对象的差异。
这个方法可以命名为"compare",接受两个参数,分别是修改前和修改后的对象。
在这个方法内部,我们可以使用反射机制来比较这两个对象的所有字段,并将差异信息保存到对象差异信息类中。
4. 定义展示差异方法在"ObjectDiffs"工具类中,我们还需要定义一个方法,用于展示对象之间的差异信息。
这个方法可以命名为"printDiffs",接受一个对象差异信息类作为参数。
在这个方法内部,我们可以遍历对象差异信息类中的所有字段,并将其打印出来。
5. 编写测试代码完成上述步骤后,我们可以编写一些测试代码来验证我们的工具类。
例如,创建两个对象,对其中一个对象进行修改,然后使用我们的工具类来比较这两个对象,并展示差异信息。
6. 扩展功能如果有需要,我们还可以进一步扩展我们的工具类,使其支持更多的功能。
java⽐较两个实体类及属性差异⼯具类(简版)思路:通过反射技术获取所有属性并进⾏对⽐,详细步骤如下:package com.app.business.utils;import java.beans.Introspector;import java.beans.PropertyDescriptor;import ng.reflect.Method;import java.sql.Timestamp;import java.util.Date;import java.util.HashMap;import java.util.List;import java.util.Map;/*** Created by MJ·J on 2019-11-08*/public class ClassCompareUtil {/*** ⽐较两个实体属性值,返回⼀个boolean,true则表时两个对象中的属性值⽆差异* @param oldObject 进⾏属性⽐较的对象1* @param newObject 进⾏属性⽐较的对象2* @return 属性差异⽐较结果boolean*/public static boolean compareObject(Object oldObject, Object newObject) {Map<String, Map<String,Object>> resultMap=compareFields(oldObject,newObject);if(resultMap.size()>0) {return true;}else {return false;}}/*** ⽐较两个实体属性值,返回⼀个map以有差异的属性名为key,value为⼀个Map分别存oldObject,newObject此属性名的值 * @param oldObject 进⾏属性⽐较的对象1* @param newObject 进⾏属性⽐较的对象2* @return 属性差异⽐较结果map*/@SuppressWarnings("rawtypes")public static Map<String, Map<String,Object>> compareFields(Object oldObject, Object newObject) {Map<String, Map<String, Object>> map = null;try{/*** 只有两个对象都是同⼀类型的才有可⽐性*/if (oldObject.getClass() == newObject.getClass()) {map = new HashMap<String, Map<String,Object>>();Class clazz = oldObject.getClass();//获取object的所有属性PropertyDescriptor[] pds = Introspector.getBeanInfo(clazz,Object.class).getPropertyDescriptors();for (PropertyDescriptor pd : pds) {//遍历获取属性名String name = pd.getName();//获取属性的get⽅法Method readMethod = pd.getReadMethod();// 在oldObject上调⽤get⽅法等同于获得oldObject的属性值Object oldValue = readMethod.invoke(oldObject);// 在newObject上调⽤get⽅法等同于获得newObject的属性值Object newValue = readMethod.invoke(newObject);if(oldValue instanceof List){continue;}if(newValue instanceof List){continue;}if(oldValue instanceof Timestamp){oldValue = new Date(((Timestamp) oldValue).getTime());}if(newValue instanceof Timestamp){newValue = new Date(((Timestamp) newValue).getTime());}if(oldValue == null && newValue == null){continue;}else if(oldValue == null && newValue != null){Map<String,Object> valueMap = new HashMap<String,Object>();valueMap.put("oldValue",oldValue);valueMap.put("newValue",newValue);map.put(name, valueMap);continue;}if (!oldValue.equals(newValue)) {// ⽐较这两个值是否相等,不等就可以放⼊map了 Map<String,Object> valueMap = new HashMap<String,Object>();valueMap.put("oldValue",oldValue);valueMap.put("newValue",newValue);map.put(name, valueMap);}}}}catch(Exception e){e.printStackTrace();}return map;}}结果集及效果如图:。
1、说明改善Java服务器的性能需要模拟负载下的服务器。
创建一个模拟环境、搜集数据并且分析结果可能是对许多开发人员的挑战。
这里介绍了使用JProfiler跟踪分析Java服务器的性能。
简单的性能问题很容易分离并解决,然而,大的性能问题,如内存溢出或者系统的罢工,通常在系统处于高负载情况下发生,就不能这么简单的处理了。
这些问题需要一个独立的测试环境、一个模拟的负载,并且需要仔细地分析和跟踪。
2、改善服务器的性能服务器的性能改善是依赖于数据的。
没有可靠的数据基础而更改应用或环境会导致更差的结果。
分析器提供有用的Java服务器应用信息,但由于从单用户负载下的数据与多用户负载下得到的数据是完全不同的,这导致分析器的数据并不精确。
在开发阶段使用分析器来优化应用的性能是一个好的方式,但在高负载下的应用分析可以取到更好的效果。
在负载下分析服务器应用的性能需要一些基本的元素:1、可控的进行应用负载测试的环境。
2、可控的人造负载使得应用满负荷运行。
3、来自监视器、应用和负载测试工具自身的数据搜集。
4、性能改变的跟踪。
不要低估最后一个需求(性能跟踪)的重要性因为如果不能跟踪性能你就不能实际的管理项目。
性能上10-20%的改善对单用户环境来说并没有什么不同,但对支持人员来说就不一样了。
20%的改善是非常大的,而且通过跟踪性能的改善,你可以提供重要的反馈和持续跟踪。
虽然性能跟踪很重要,但有时为了使后续的测试更加精确而不得不抛弃先前的测试结果。
在性能测试中,改善负载测试的精确性可能需要修改模拟环境,而这些变化是必须的,通过变化前后的负载测试你可以观察到其中的转变。
3、分析器原理现在几乎所有的分析器都是从同一个起点和约束开始的:Java 虚拟机分析器界面(JVMPI) (参考"The Java Virtual Machine Profiler Interface")。
Sun微系统的API允许工具开发商接口或者连接到遵循JVMPI的JVM上,并且监控运作的方式以及JVM运行任何Java程序时的关键事件--从单独的应用程序到Applet 、Servlet和企业JavaBeans (EJB)组件。
面向对象单元测试用例自动生成工具对比分析随着软件工程的快速发展,面向对象编程已成为一种主流方法,而面向对象单元测试也变得非常重要。
做正确的单元测试可以有效地提高软件质量,减少开发团队的测试开销并节省时间。
但是,单元测试需要大量的人工编写用例,时间成本相对较高,因此需要一些工具简化这个过程。
目前,有许多用于自动化单元测试用例生成的工具。
本文将介绍两种主要的工具: EvoSuite和CodePro AnalytiX,并比较它们的优缺点。
EvoSuite是一个JAVA程序的自动化测试工具。
它使用遗传算法和神经网络来生成测试用例,可以为Java代码中的自动测试和无自动测试的类生成高质量的测试用例。
EvoSuite生成的测试用例自动检测程序错误,同时生成的测试用例通常具有较高的代码覆盖率。
EvoSuite具有以下优点:1. 生成的测试用例具有高覆盖率。
EvoSuite自动生成了针对所有程序路径的测试,可以快速发现代码中的潜在问题。
2. 可以很好地集成到开发环境中,包括Eclipse、 Maven等。
它还支持JUnit测试框架,可以集成到持续集成环境中。
3. EvoSuite为开发人员节省了时间。
开发人员只需提供要测试的程序的字节码,EvoSuite就可以自动生成测试用例。
4. EvoSuite支持Java的最新版本,如Java 8和Java 9.但是,EvoSuite也有以下缺点:1. 生成测试代码的语法不总是容易理解。
因为这个原因,开发人员可能需要调整生成的代码以便于理解和维护。
2. EvoSuite不能全面测试系统的功能。
尽管EvoSuite试图在代码中覆盖所有行,但它不能测试整个程序或系统的功能。
3. EvoSuite依赖于遗传算法和神经网络,这意味着在某些情况下程序可能没有足够的时间来生成测试用例。
CodePro AnalytiX是另一个JAVA程序自动化测试工具。
它使用JUnit测试框架来生成测试用例,也可以使用Coverage和Complexity Metrics等其它插件来支持测试用例生成。
常用 Java Profiling 工具的分析与比较在 Java 程序的开发过程中,不可避免地会遇到内存使用、性能瓶颈等问题。
Java Profiler 工具能帮助开发人员快速、有效地定位这些问题,因此成为了 Java 开发过程中的一个重要工具。
目前市场上的 Java Profiler 工具种类繁多,本文将对目前比较常见的几种工具进行简要介绍,并从功能、性能等角度作比较,从而帮助 Java 程序员选择合适的 Java Profiler 工具。
本文主要分为三个部分:第一部分简要介绍 Java Profiler 工具的原理;第二部分对目前常见的 Java Profiler 工具 TPTP, CodePro Profiler, YourKit Java Profiler, JProfiler 进行简要介绍;第三部分对以上工具从不同的角度进行比较,帮助开发人员选择合适的工具。
∙内容相对于静态代码分析,Profiling 是通过收集程序运行时的信息来研究程序行为的动态分析方法。
其目的在于定位程序需要被优化的部分,从而提高程序的运行速度或是内存使用效率。
收集程序运行时信息的方法主要有以下三种:∙事件方法:对于 Java,可以采用 JVMTI(JVM Tools Interface)API 来捕捉诸如方法调用、类载入、类卸载、进入 / 离开线程等事件,然后基于这些事件进行程序行为的分析。
∙统计抽样方法(sampling): 该方法每隔一段时间调用系统中断,然后收集当前的调用栈(call stack)信息,记录调用栈中出现的函数及这些函数的调用结构,基于这些信息得到函数的调用关系图及每个函数的 CPU 使用信息。
由于调用栈的信息是每隔一段时间来获取的,因此不是非常精确的,但由于该方法对目标程序的干涉比较少,目标程序的运行速度几乎不受影响。
∙植入附加指令方法(BCI): 该方法在目标程序中插入指令代码,这些指令代码将记录 profiling 所需的信息,包括运行时间、计数器的值等,从而给出一个较为精确的内存使用情况、函数调用关系及函数的 CPU 使用信息。
该方法对程序执行速度会有一定的影响,因此给出的程序执行时间有可能不准确。
但是该方法在统计程序的运行轨迹方面有一定的优势。
目前市面上的 Java Profiler 工具采用的信息收集方法通常是以上三种方法的任意组合。
Profiler 工具功能简介虽然市场上的 Java Profiler 工具有不少,但是基本功能大多相似,本节首先对这些基本功能进行介绍。
∙遥测(Telemetry):遥测是一种用来查看应用程序运行行为的最简单的方法。
通常会有多个视图(View)分别实时地显示 CPU 使用情况、内存使用情况、线程状态以及其他一些有用的信息,以便用户能很快地发现问题的关键所在。
o CPU Telemetry 视图一般用于显示整个应用程序的 CPU 使用情况,有些工具还能显示应用程序中每个线程的 CPU 使用情况。
o Memory Telemetry 视图一般用于显示堆内存和非堆内存的分配和使用情况。
o Garbage Collection Telemetry 视图显示了 JVM 中垃圾收集器的详细信息。
o Threads Telemetry 视图一般用于显示当前运行线程的个数、守护进程的个数等信息。
o Classes Telemetry 视图一般用于显示已经载入和还没有载入的类的数量。
∙快照(snapshot):应用程序启动后,profiler 工具开始收集各种执行数据,其中一些数据直接显示在遥测视图中,而另外大部分数据被保存在内部,直到用户要求获取快照,基于这些保存的数据的统计信息才被显示出来。
快照包含了应用程序在一段时间内的执行信息,通常有两种类型的快照:CPU 快照和内存快照。
o CPU 快照主要包含了应用程序中函数的调用关系及运行时间,这些信息通常可以在 CPU 快照视图中进行查看。
o内存快照则主要包含了内存的分配和使用情况、载入的所有类、存在的对象信息及对象间的引用关系。
这些信息通常可以在内存快照视图中进行查看。
∙CPU Profiling:CPU Profiling 的主要目的是统计函数的调用情况及执行时间,或者更简单的情况就是统计应用程序的 CPU 使用情况。
通常有两种方式来显示 CPU Profiling 结果:CPU 遥测和 CPU 快照。
∙内存 Profiling:内存 Profiling 的主要目的是通过统计内存使用情况检测可能存在的内存泄露问题及确定优化内存使用的方向。
通常有两种方式来显示内存 Profiling 结果:内存遥测和内存快照∙线程 Profiling:线程 Profiling 主要用于在多线程应用程序中确定内存的问题所在。
一般包括三个方面的信息:o某个线程的状态变化情况o死锁情况o某个线程在线程生命期内状态的分布情况∙Profiling 的启动设置:类似于 eclipse 中 Run 和 Debug 的启动设置,进行 Profiling 之前也需要进行启动设置,包括:profiling 的模式(CPU profiling 或内存 profiling),信息获取类型(遥测 , 抽样统计或者 BCI ) 等等。
∙Profiler Preference 设置:主要用于 Profiler 过滤器(选择需要关注的包、类)、取样间隔时间的设置等。
Java Profiler 工具介绍本文接下来将对目前市场上常见的几种 Java Profiler 工具进行介绍。
TPTPTPTP(Test and Performance Tools Platform)是 eclipse 官方的 Profiling 工具插件。
TPTP 提供了诸如测试,追踪(trace),性能测试,图形界面性能分析等功能。
同时 TPTP 还是一个可扩展的开发平台框架,你可以对它加以扩展集成到你自己的产品中。
TPTP 可以通过 Eclipse update Manager 或者是安装包进行安装,安装成功后会在 eclipse 中增加如下所示的按钮,另外一个专门的用于检查 TPTP profiling 结果的 perspective 也会添加进 eclipse 中,如下图所示:图 1. TPTPCodePro ProfilerCodePro Profiler 是由 instantiations 公司推出的一款商用 eclipse 插件,它可以通过 Eclipse update Manager 进行安装或者是将安装包直接解压缩后保存在 eclipse 的指定目录下。
与 TPTP 类似,安装成功后,有一个专门的用于查看 CodePro profiling 结果的 perspective 会添加进 eclipse 中,如下图所示:图 2. CodeProYourKit ProfilerYourKit Java Profiler 也是一款商用软件,支持的操作系统包括:Windows, Linux, FreeBSD, Mac OS X, Solaris 以及 HP-UX;支持的 IDE 包括:Eclipse, JBuilder, JDeveloper, NetBeans 以及 Intellij IDEA。
安装成功且首次启动YourKit Java Profiler 后,会弹出一个对话框,让用户选择 YourKit Java Profiler 要集成进的 IDE,并指定该 IDE 的安装路径,点击”Install Plugin”按钮并集成成功之后,Eclipse 中会出现如下图标,用户就可以从Eclipse 中启动 Profiling,但是 profiling 的结果需要在 YourKit Java Profiler 中进行查询,如下图所示:图 3. YourKitJProfilerJProfiler 是由 ej-technologies 推出的一款商用软件,支持的操作系统有:Windows, Linux, Mac OS X, FreeBSD, Solaris, AIX 以及 HP-UX;支持的 IDE 包括:Eclipse, NetBeans, Intellij IDEA, JBuiler 以及 JDeveloper。
安装成功并首次启动 JProfiler 后,会弹出一个设置界面,当完成左栏所示的那些步骤后,Eclipse 中就会出现如下图标,用户就可以从 Eclipse 中启动Profiling。
与 YourKit Java Profiler 类似,profiling 的结果需要在JProfiler 中进行查询,如下图所示:图 4. JProfiler回页首Java Profiler 工具比较本章节将从如下几个方面对上述工具进行比较:∙与 Eclipse 的集成性o TPTP:是一款基于 Eclipse 开发的插件,因此与 eclipse 的集成性很好。
安装成功后,对 TPTP 的一切设置与操控都可以在eclipse 中完成;另外,profiling 的结果也可以在 eclipse 中进行查询。
o CodePro Profiler: 与 TPTP 类似,CodePro Profiler 也是一款基于 eclipse 开发的插件,因此与 eclipse 的集成性很好好。
用户在 eclipse 中就可以完成对 profiling 的所有操作。
o YourKit Java Profiler: YourKit Java Profiler 可以说是一个比较独立的工具,安装成功后,用户可以直接在 eclipse 中启动YourKit Java Profiler 并对 profiling 选项进行配置,但是用户必须在 YourKit Java Profiler 工具中对 Profilingpreferrence 进行配置,而且 profiling 信息必须在 YourKitJava Profiler 中进行查看。
因此和 Eclipse 的集成度一般。
o JProfiler: JProfiler 也是一款比较独立的工具,安装成功后,用户可以直接在 eclipse 中启动 JProfiler,其他所有操作必须回到 JProfiler 工具中进行。
因此和 Eclipse 的集成性不好。
∙遥测种类o TPTP:目前使用的 4.6.2 的版本只提供了线程 Telemetry。
o CodePro Profiler: 总共有五个类型:CPU, 内存 , 线程 , 载入的类以及垃圾收集。
o YourKit Java Profiler: 与 CodePro Profiler 相比,缺少载入类的监测。