喜樂農場-筆耕紀實
Hi, This is Samuel's Google-Blogger. Welcome ...
這裡將記錄著我們全家的點點滴滴...
有笑、有淚、有生命的足跡...
星期五, 3月 22, 2013
Java效能監控與除錯工具簡介
Java效能監控與除錯工具簡介
I.Java SE
1.HPROF profiler a.Heap Profiler(HPROF)工具是一個簡單的監視程序代理隨著JDK發行。 它是一個動態鏈接庫,透過Java虛擬機工具接口(JVM TI)與Java VM對接。 HPROF實際上是通過JVM命令列選項,在JVM啟動時動態加載的 b.指令語法: java -agentlib:hprof[=options] ToBeProfiledClass c.可以呈現JVM的 CPU使用率 記憶體堆疊分配統計 監控競爭基本資料 報告完整的記憶體堆疊傾印 報告所有監控對象與執行緒狀態 d.根據不同分析要求的類型,HPROF指示虛擬機發送相關的JVM TI事件和處理事件的數
據去進行分析信息。
2.JConsole utility
a.一個 java GUI 監視工具,可以以圖表化的形式顯示各種數據。 並可通過遠程
連接監視遠程的服務器 VM 。
b.JBoss AS組態供遠程jconsole監控
請參考 : http://blog.csdn.net/lengyuhong/article/details/6200355
jvm執行參數
-Djboss.platform.mbeanserver
-Djavax.management.builder.initial=org.jboss.system.server.jmx.MBeanServerBuilderImpl
-Djava.rmi.server.hostname=127.0.0.1
-Dcom.sun.management.jmxremote.port=8950
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
3.jhat utility
a.用於對 JAVA heap 進行離線分析的工具,它可以對不同虛擬機中導出的 heap
信息文件進行分析。
b.參考指令
jhat -J-Xmx512m d:\temp\jboss_heapdump.bin
上述指令啟動後,可開啟瀏覽器鍵入網址 http://localhost:7000 檢視收集到之
相關數據
c.有哪些資訊可觀察?
All classes including platform
顯示出堆疊中所包含的所有類別
Show all members of the rootset
根集合可以引用到的成員對象
Show instance counts for all classes (including platform)
顯示所有類別實例數量(包含平台)
Show instance counts for all classes (excluding platform)
顯示所有類別實例數量(不包含平台)
Show heap hitogram
顯示堆疊實例分佈表
Show finalizer summary
Execute Object Query Language (OQL) query
執行對象查詢語句
4.jinfo utility
a.輸出並修改運行時的java 進程的 opts 。 用處比較簡單, 用於 輸出 JAVA 系統
參數 及命令行參數 。
b.參考指令
jinfo -opt pid
jinfo -flag MaxPermSize 2788
5.jmap utility
a.打印出某個java進程(使用 pid)內存內的所有 ' 對象 ' 的狀況(如:產生那些對
象,及其數量)。
b.參考指令
jmap -J-d64 -dump:format=b,file=jboss_heapdump.bin 6109
6.jps utility
a.用來查看 基於HotSpot JVM 裡面所有進程的具體狀態 , 包括進程 ID ,進程啟
動的路徑等等。
與 unix 上的 ps 類似,用來顯示本地 有權限 的java 進程,可以查看本地運行著
幾個 java 程序,並顯示他們的進程號。 使用jps 時,不需要傳遞進程號做為參
數。
jps 也可以顯示遠程系統上的 JAVA 進程,這需要遠程服務上開啟了 jstat 服務
b.參考指令
jps
7.jstack utility
a.用於打印出給定的 java 進程 ID 或 core file 或遠程調試服務的 Java 堆棧信息。
b.參考指令
jstack 4075 >> /home/ubuntu/jstack_threaddumps.log
8.jstat utility
a.是 JDK 自帶的一個輕量級小工具。 全稱 “Java Virtual Machine statistics monitoring
tool”主要利用JVM內建的指令對Java應用程序的資源和性能進行實時的命令行
的監控,包括了對Heap size和垃圾回收狀況的監控。
b.重要參考文章
http://blog.csdn.net/fenglibing/article/details/6321453
c.參考指令
jstat -gcutil vmid interval count >> /home/ubuntu/jstat_20130321.log
jstat -gcutil 7384 1s 120 >> d:/jstat_20130321.log
9.jstatd daemon
a.是一個RMI Server應用程序,提供了對JVM的創建和結束監視,也為遠程監視
工具提供了一個可以attach的接口
b.參考指令
製作安全政策檔 : tools.policy
----------------------------------------------------------------------------
grant codebase "file:${java.home}/../lib/tools.jar" {
permission java.security.AllPermission;
};
----------------------------------------------------------------------------
執行 : jstatd -p 10990 -J-Djava.security.policy=tools.policy&
II.Eclipse
1.Memory Analyzer(MAT)
a.一個基於Eclipse的內存分析工具,是一個快速、功能豐富的JAVA heap分析工
具,它可以幫助我們查找內存洩漏和減少內存消耗。
當服務器應用佔用了過多內存的時候,會遇到OutOfMemoryError。 如何快速定
位問題呢? Eclipse MAT的出現使這個問題變得非常簡單。 它能夠離線分析
dump的文件數據。
b.有哪些資訊可觀察?
記憶體內存洩露報表
自動檢查可能存在內存洩露的對象,通過報表展示存活
的對像以及為什麼他們沒有被垃圾收集
對象報表
對可疑對象的分析,如字符串是否定義重了,空的collection、
finalizer以及弱引用等
2.GCHisto工具
a.取得GC監控記錄檔,需對監測對象執行環境之jvm設定Java
b.命令列參數
-Xloggc:D:/gc.log -verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails
c.源碼庫
http://java.net/projects/gchisto/sources
JConsole with JBoss AS 5.1.0 GA
環境:
JDK7+/Eclipse Indigo SR2
問題:
若專案中有客製化之MBean服務的話,JBoss5要開啟jmx遠端監聽埠號讓JConsole監控時,會導致客製化之MBean模組衝突而無法啟動
步驟:
1.可參考https://community.jboss.org/thread/153594
2.更新$JBOSS_HOME/bin/run.jar檔,請先從$JBOSS_HOME/lib/jboss-system-jmx.jar檔中,分
別取出 org.jboss.system.server.jmx.LazyMBeanServer.class 與
org.jboss.system.server.jmx.MBeanServerBuilderImpl.class 這兩個類別檔,將它們拷貝至run.jar
檔內
3.再參考http://www.blogjava.net/shapos/archive/2010/10/10/334177.html?opt=admin
4.設定java啟動參數:
-Djboss.platform.mbeanserver
-Djavax.management.builder.initial=org.jboss.system.server.jmx.MBeanServerBuilderImpl
-Djava.rmi.server.hostname=127.0.0.1
-Dcom.sun.management.jmxremote.port=8950
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Xloggc:D:/gc.log -verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails
ps. 上面java組態設定中,紅色部分為解決MBean衝突、藍色部分才是為建立與JConsole遠端
監控之介面,而最後一行黑色部分是設定為jvm輸出GC活動記錄而設
5.啟動JConsole開始監控JBoss
星期六, 7月 23, 2011
Java 5以上有關泛型集合拷貝操作的問題
- 緣起:
昨天辦公室裡同事在問我有關JDK5以上有關泛型集合拷貝操作的問題,他的需求是希望能保留原始集合內所有物件之內容,因此先將原始的集合先行拷貝一份至記憶體內,然後針對這份拷貝出來的集合在行修改操作,這樣一來既可以保留原來的那一份,又可以毫無顧慮地對拷貝出來的這份恣意地修改。
- 問題
但是問題是當他使用集合的拷貝方法時,如:ArrayList.clone()時,Java似乎並沒有真的在記憶體內,重新拷貝新的集合到另一快新的記憶體區塊內。導致他怎麼操作修改新的那份集合,都會連帶異動到原始集合內的資料。
- 解法
簡單地說,以Dog這個類別為例,就是要實作Cloneable這個介面的clone()方法即可。
範例程式碼如下:
- Dog.java
public class Dog implements Cloneable {private String kind;private String color;public Dog(String kind, String color) {super();this.kind = kind;this.color = color;}public String getKind() {return kind;}public void setKind(String kind) {this.kind = kind;}public String getColor() {return color;}public void setColor(String color) {this.color = color;}protected Object clone() throws CloneNotSupportedException {return super.clone();}}
- ListCloneTest.java
import java.util.ArrayList;public class ListCloneTest {/*** @param args* @throws CloneNotSupportedException*/public static void main(String[] args) throws CloneNotSupportedException {// TODO Auto-generated method stubArrayListoldDogs = new ArrayList (); ArrayListnewDogs; oldDogs.add(new Dog("a", "white"));oldDogs.add(new Dog("b", "block"));newDogs = new ArrayList(oldDogs.size()); for(Dog dog : oldDogs){newDogs.add((Dog) dog.clone());}newDogs.get(0).setColor("yellow");newDogs.get(1).setKind("d");System.out.println("Old Dogs#1 : kink="+oldDogs.get(0).getKind()+" color="+oldDogs.get(0).getColor());System.out.println("New Dogs#1 : kink="+newDogs.get(0).getKind()+" color="+newDogs.get(0).getColor());System.out.println("Old Dogs#2 : kink="+oldDogs.get(1).getKind()+" color="+oldDogs.get(1).getColor());System.out.println("New Dogs#2 : kink="+newDogs.get(1).getKind()+" color="+newDogs.get(1).getColor());}}
- 輸出結果:
Old Dogs#1 : kink=a color=whiteNew Dogs#1 : kink=a color=yellowOld Dogs#2 : kink=b color=blockNew Dogs#2 : kink=d color=block
訂閱:
文章 (Atom)