本文是本人前一段时间作一个简单Java监控工具调研总结,主要包括VisualVm ,JProfiler,Perfino,Yourkit,Perf4J,JProbe,以及对Java微基准测试的简单介绍,总结下来比较推荐,Visualvm,Perfino,yourkit和Jprofiler(推荐值按顺序依次递减),其它工具不太推荐使用。下面是文章目录结构:html
1、VisualVm java
1、简介 2linux
2、安装插件并启动VisualVM 2web
3、内存分析 3apache
4、CPU分析 5bootstrap
5、线程分析 6tomcat
6、链接远程tomcat的方法 8服务器
6.1什么是JMX? 9网络
2、JProfiler app
1、简介 9
2、下载安装 9
2.1破解 10
2.3安装插件 11
2.4配置 12
3、 Perfino
1.简介 18
2. 下载、安装、配置 18
2.1下载 18
2.2配置 18
4、 Yourkit
1、简介 19
2、下载、安装、配置 19
2.1下载 19
2.2破解 20
2.3配置 20
5、Jetm
1.简介 21
6、Perf4J
1.简介 21
2.配置 21
7、JProbe
1.简介 22
8、Java微基准测试
1.示例 22
1.1如何设置断言 24
2.基准测试流程 24
2.1典型的 Java 基准测试代码 25
3、 影响基准测试的因素 25
4、如何尽量减少基准测试中不可避免的度量误差? 26
4.1什么是置信区间? 26
5.使用框架Benchmark进行基准测试 26
也能够直接在线观看word文档:http://pan.baidu.com/s/1i3zdSVF
VisualVM 是一款免费的性能分析工具。它经过 jvmstat、JMX、SA(Serviceability Agent)以及 Attach API 等多种方式从程序运行时得到实时数据,从而进行动态的性能分析。同时,它能自动选择更快更轻量级的技术尽可能减小性能分析对应用程序形成的影响,提升性能分析的精度。
打开方式1:Windows环境下输入cmd ==> jvisualvm
打开方式2:Windows环境下Jdk安装目录中C:\Java\jdk1.7.0_15\bin\jvisualvm.exe,双击jvisualvm.exe便可.
从 VisualVM 插件中心安装插件安装步骤 :
预览:
VisualVM 经过检测 JVM 中加载的类和对象信息等帮助咱们分析内存使用状况,咱们能够经过 VisualVM 的监视标签和 Profiler 标签对应用程序进行内存分析。
在监视标签内,咱们能够看到实时的应用程序内存堆以及永久保留区域的使用状况。
Dump在本文中表示转储的意思。
下图是93机器的内存使用状况
堆Dump
装入刚才Dump的文件(200M)
加载后的dump分析:
关于内存分析能够了解:Memory Analyzer Tool(eclispe插件:http://www.eclipse.org/mat/ )
使用 Eclipse Memory Analyzer 进行堆转储文件分析,参考文章:http://www.ibm.com/developerworks/cn/opensource/os-cn-ecl-ma/
在监视标签内,咱们能够查看 CPU 的使用率以及垃圾回收活动对性能的影响。太高的 CPU 使用率多是因为咱们的项目中存在低效的代码,能够经过 Profiler 标签的 CPU 性能分析功能进行详细的分析。若是垃圾回收活动过于频繁,占用了较高的 CPU 资源,多是由内存不足或者是新生代和旧生代分配不合理致使的等。
线程监视状况:
线程分析详细信息:
线程dump图:
关于线程dump:http://blog.csdn.net/gaojava/article/details/12859363
关于visualvm: http://www.ibm.com/developerworks/cn/java/j-lo-visualvm/index.html
/opt/apache-tomcat-7.0.42/bin/catalina.sh
#JAVA_OPTS="$JAVA_OPTS -Djava.rmi.server.hostname=172.16.8.82"
#JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8765"
#JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.ssl=false"
#JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.authenticate=false"
JAVA_OPTS="-Djava.rmi.server.hostname=172.16.8.82 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8765 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false";
右键,添加JMX链接,链接远程:
JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序、设备、系统等植入管理功能的框架。JMX是一种JAVA的正式规范,它主要目的是让程序有被管理的功能。
JProfiler是一个全功能的Java剖析工具(profiler),专用于分析J2SE和J2EE应用程序。JProfiler是一个商业受权的Java剖析工具。
下载地址:http://www.ej-technologies.com/download/jprofiler/files 目前最新版:8.0.7 (2014/07/28)
License key:(来源于网络)
L-Larry_Lau@163.com#23874-hrwpdp1sh1wrn#0620
L-Larry_Lau@163.com#36573-fdkscp15axjj6#25257
L-Larry_Lau@163.com#5481-ucjn4a16rvd98#6038
L-Larry_Lau@163.com#99016-hli5ay1ylizjj#27215
L-Larry_Lau@163.com#40775-3wle0g1uin5c1#0674
Linux环境配置jprofiler
将下载好的jprofiler_linux_8_0_7.sh (http://download-aws.ej-technologies.com/jprofiler/jprofiler_linux_8_0_7.sh)
上传到远程服务器而后进行安装,按默认提示进行安装。
选择端口,默认便可:
上面的配置没有彻底成功,可是思路是正确的,能够简单作个参考吧。
Perfino和Jprofiler同属于ej-technologies公司的产品,2014年刚刚推出来,很是新。
下载地址:http://www.ej-technologies.com/download/perfino/files
目前最新版本的是1.0。
安装比较简单,一直下一步便可。
须要简单配置一下(目前只有30天的试用期):
能够配置邮件服务器,用来发送监控邮件:
perfino能够监控web项目发出的请求的记录,其用时多久,以及目前CPU的占用,是很是实用的工具,比较推荐!但由于是比较新的工具,目前网上还搜不到多少资料,并且收费也比较高。
YourKit Java Profiler 是业界领先的Java和.NET的剖析工具。CPU和内存的剖析从来是很困难的,YourKit创造出了革命性的剖析工具,应用在研发和生产阶段,为专业的Java和.NET开发者带来了无比的好处。
下载地址:
http://www.yourkit.com/java/profiler/index.jsp
目前最新版:yjp-2013-build-13088
安装:
一直下一步就能够了。
name:
amosli
License-key:
05c970aa7bebced4cda625484241634c28c77b9865448d2f1ae0584df14560b6034a5db93b4425ebc5356fe3730931cd8ac6c09032fd8957f799bf83fa216b735a83086ccf676836087524529b5dad5a72355918bba492b846075b5bc7c2991160343cc001f6063ab833f968127677da0be20da4802d1a450d838c130864b23dfeb44d944b0a78296cffcd6857a320a0b93d324a07de15bde6e9f22c6fc3c2aef2fab0f5f4664808b1f7a4b91e826911612f0d2a278ddf510590e924d5b5aadd21bcdbd24be63d2d5b18d18527ae496daf28f43f45d6ad73c2d19e3cf34e948d6215b483b163aff99cc4897b364ba72049eaaf9e1b7d9f5b0d988e08ceaf53cc15d051e65a0287
破解所须要文件:http://pan.baidu.com/s/1hqFuEcW (破解文件来源网络)
安装ide插件.
插件安装教程:http://www.yourkit.com/docs/yjp2013/help/ide_integration.jsp
Eclipse下的安装教程:http://www.yourkit.com/docs/yjp2013/help/complete_eclipse35.jsp
配置可参考:http://zhwj184.iteye.com/blog/764575
2.demo演示
http://www.yourkit.com/docs/demo/JavaEE/JavaEE.htm
其和Jprofiler很是像!但更建议使用Yourkit,由于配置更简单一点。
JETM是一个Java程序执行时间测量工具,很是轻量级的代码执行时间监控,主要能够记录
WEB项目中发送请求的时间统计等信息以帮助开发人员定位Java程序中的性能问题。
版本记录:
2013/05/12 Good bye sourceforge!
2013/04/01 JETM 1.3.0 on it's way
2009/02/12 Spring bugfix release JETM 1.2.3
2007/07/09 Minor release JETM 1.2.2
2007/05/01 Bugfix release: JETM 1.2.1
Online Demo
http://jetm.void.fm/jetm-demo/
官网介绍:
Perf4J is to System.currentTimeMillis() as log4j is to System.out.println()
最近的更新时间:Last Published: 2011-10-16
最新版本:0.9.16
Maven配置:
<dependency> <groupId>org.perf4j</groupId> <artifactId>perf4j</artifactId> <version>0.9.16</version> </dependency>
示例:
public static void main(String[] args) throws Exception { StopWatch stopWatch = new LoggingStopWatch(); long currentTimeMillis = System.currentTimeMillis(); for (int i = 1; i<2000; i++) { System.out.println("i:"+i);} stopWatch.stop("test.class","执行完成dd! "); System.out.println("time:"+(System.currentTimeMillis()-currentTimeMillis)); }
输出:
i:1996
i:1997
i:1998
i:1999
start[1406469879021] time[44] tag[test.class] message[执行完成dd! ]
time:44
Jprobe主要作Java内存分析,Java线程分析,CPU分析,和JProfiler相似。
2012年7月份Quest公司被DELL以24亿美圆收购,2013年Jprobe退出市场。
目前不多有人在用。
protected static int global; public static void main(String[] args) { long t1 = System.nanoTime(); int value = 0; for (int i = 0; i < 100 * 1000 * 1000; i++) { value = calculate(value); } long t2 = System.nanoTime(); System.out.println("Execution time: " + ((t2 - t1) * 1e-6) + " milliseconds"); } protected static int calculate(int arg) { // assert (arg >= 0) : "should be positive";//L1 //if (arg < 0) throw new IllegalArgumentException("arg = " + arg + " < 0");//L2 global = arg * 6; global += 3; global /= 2; return arg + 2; }
选项:
2002 JavaOne大会结果:
个人电脑最终的执行结果:
Execution time: 2272.067122 milliseconds //a
Execution time: 2049.659045 milliseconds //b
Execution time: 2053.542801 milliseconds //c
Execution time: 2033.220091 milliseconds//d
Execution time: 2086.269581 milliseconds //放掉L1,L2注释
boolean isOpen = false; assert isOpen=true; //若是开启了断言,会将isOpen的值改成true System.out.println(isOpen);//打印是否开启了断言 // 选择菜单:Run ---> Run... ---> 选择 Arguments 选项卡 // 在 VM arguments 文本框中输入: -ea 注意 中间没有空格,若是输入 -da 表示禁止断言。 // -ea java -ea 打开全部用户类的assertion // -da java -da 关闭全部用户类的assertion // -ea:<classname> java -ea:MyClass1 打开MyClass1的assertion // -da:<classname> java -da: MyClass1 关闭MyClass1的assertion // -ea:<packagename> java -ea:pkg1 打开pkg1包的assertion // -da:<packagename> java -da:pkg1 关闭pkg1包的assertion // -ea:... java -ea:... 打开缺省包(无名包)的assertion // -da:... java -da:... 关闭缺省包(无名包)的assertion // -ea:<packagename>... java -ea:pkg1... 打开pkg1包和其子包的assertion // -da:<packagename>... java -da:pkg1... 关闭pkg1包和其子包的assertion // -esa java -esa 打开系统类的assertion // -dsa java -dsa 关闭系统类的assertion // 综合使用 java -dsa:MyClass1:pkg1 关闭MyClass1和pkg1包的assertion
基准测试一般的过程是:1)记录开始时间,2)执行代码,3)记录结束时间,4)计算时间差。
long t1 = System.currentTimeMillis(); task.run(); // task is a Runnable which encapsulates the unit of work long t2 = System.currentTimeMillis(); System.out.println("My task took " + (t2 - t1) + " milliseconds to execute.");
在真实环境中,System.currentTimeMillis 的分辨率可能会糟糕 10-100 倍。它的 Javadoc 指出:
注意,尽管返回值的时间单位是毫秒,可是值的粒度取决于底层操做系统,甚至可能比操做系统的时间单位更大。例如,许多操做系统以几十毫秒做为时间度量的单位。
已经报告的分辨率数据见表 1:
表 1. 分辨率
分辨率 |
平台 |
来源 |
55 ms |
Windows 95/98 |
Java Glossary |
10 ms |
Windows NT, 2000, XP 单处理器 |
Java Glossary |
15.625 ms |
Windows XP 多处理器 |
Java Glossary |
~15 ms |
Windows(多是指 XP) |
Simon Brown |
10 ms |
Linux 2.4 内核 |
Markus Kobler |
1 ms |
Linux 2.6 内核 |
Markus Kobler |
因此,对于执行时间小于 10 秒的任务,上面 中的代码很容易出现过大的偏差。
Java的执行过程是很复杂的,这其中会有不少因素影响到基准测试。一般来讲,Java代码在开始执行阶段会相对很慢,以后会愈来愈快,直到达到稳定阶段,这一过程涉及的影响因素主要有:
1) 类加载。类加载涉及到文件读取、解析、校验等系列操做,因此在计算真正的task执行前须要先执行几遍task确保类加载都完成了。若是task涉及的条件分支不少,要确保各分支的代码都覆盖到。
及时编译。
2) 动态优化。
3) Resource reclamation(资源回收,GC)
4) OS Cache和CPU Cache有时也会影响到基准测试。若是是测试文件IO操做,就不能忽略OS Cache的影响。若是是针对数值作测试,就可能要考虑CPU Cache的影响。
5) 其余因素
6) 硬件的影响,JVM参数的影响等等
置信区间并非统计数据的单一计算值(估值点[point estimate]),而是一个估值范围。与这个范围相关联的几率 p 称为置信水平(confidence level)。在大多数状况下,设 p 为 95%,这个值在置信区间比较期间保持不变。置信区间的意义很直观,由于它们的大小表示可靠性:窄的区间表示统计数据比较精确,宽的区间表示统计数据不太肯定。例如,若是任务 A 的平均执行时间的置信区间是 [1, 1.1] 毫秒,任务 B 是 [0.998, 0.999] 毫秒,那么B 的平均值就比 A 可靠性高,还能够确认它的值比 A 小(在置信水平上)。补充资料的 Confidence intervals 一节详细讨论了这个问题。
对计算第 35 个 Fibonacci 数的过程进行基准测试
public static void main(String[] args) throws Exception { Callable<Integer> task = new Callable<Integer>() { public Integer call() { return fibonacci(35); } }; System.out.println("fibonacci(35): " + new Benchmark(task)); } protected static int fibonacci(int n) throws IllegalArgumentException { if (n < 0) throw new IllegalArgumentException("n = " + n + " < 0"); if (n <= 1) return n; return fibonacci(n - 1) + fibonacci(n - 2); }
fibonacci(35): first = 305.932 ms, mean = 293.431 ms (CI deltas: -1.202 ms, +1.569 ms), sd = 10.763 ms (CI deltas: -2.332 ms, +3.826 ms) WARNING: execution times have mild outliers, SD VALUES MAY BE INACCURATE
下面解释这些结果:
v 第一次调用 fibonacci(35) 时,执行的时间是 305.932 毫秒。
v 执行时间的平均估值点是 293.431 毫秒。平均值的 95% 置信区间相对于估值点波动 -1.202,+1.569 毫秒,也就是 [292.229, 295] 毫秒。这个区间比较窄,因此这个值是可信的。
v 执行时间的标准误差估值点是 10.763 ms。标准误差的 95% 置信区间相对于估值点波动 -2.332 ms, +3.826微秒,也就是 [8.431, 14.589] 毫秒。这个区间相对来讲比较宽,因此这个值不太可信。实际上,末尾的警告指出标准误差度量不许备。
v 结果还指出出现了离群值。在这个示例中,能够不理会这些警告;可是,若是您不放心的话,能够从新运行代码并改用 Benchmark 的toStringFull 方法,这会列出全部统计数据,以便进一步分析。
参考资料:
1. http://www.udpwork.com/item/2383.html
2. http://www.ibm.com/developerworks/cn/java/j-benchmark1.html
3.http://www.ibm.com/developerworks/cn/java/j-benchmark2/
本文中用到的资料分享:http://pan.baidu.com/s/1i3FsVUP (共17.9M)