本文是本人前一段時間作一個簡單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)