基於JVM的異常診斷和性能調優

JVM GC 原理介紹:

    以前我作爲java 開發人員,用的都是sun 的JVM (這也是當今最好用的虛擬機),由於垃圾收集的工作都是交給JVM 做,只要編碼的時候注意不要在靜態的集合對象中只添加對象,而不刪除對象的情況發生,就可以避免內存泄漏,所以自己從沒有認真考慮過要將GC 好好學習一下;然而實際的工作表明,不深入的學習GC 的原理,很難解決生產中的問題。

    學習開始從理解JVM 的GC 工作原理入手。垃圾收集的過程主要分三個步驟:標記(mark ),清除(sweep ),整理(compact )。標記過程就是看看在JVM 堆中有哪些對象還有用,哪些對象不用了,有用的對象就作個標記,不用的對象就不作標記;對未作標記的對象(即不用的對象)就作第二步清除;當清除完以後,由於有用的對象此時是分散的分佈在JVM 堆中,JVM 堆就會有許多堆碎片,因而需要做第三步整理;整理(也有人翻譯成“壓縮”,實際上最準確的翻譯是“使緊湊”)就是將散放在JVM 堆中的有用對象移動到堆底部,削除堆碎片。

然而,原理雖然簡單,可各個廠商在對GC 的具體實現上卻有區別,從而導致相同的應用,在不同的JVM 上會出現不同問題。現在我們主要看看IBM JVM GC 和SUN JVM GC 的實現方式和行爲。

java 與C/C++ 在內存泄露上定義不同,java 上內存泄露是說持有了不該再持有的對象

 

一.SUN 的JVM 介紹

 


SUN 的JVM 採用分代垃圾收集 (generational garbage collection )的方式,從JDK1.4.1 開始,它將JVM 堆棧分成三個部分:年輕代(young generation )、年老代(old/tenured generation )和持久代(permanent generation )。關於分代垃圾收集的詳細介紹請查閱參考文獻( [25] 、[26])。

 

 

持久代用於存儲裝載的類、方法對象(Class 對象和Method 對象)和其它相關的元數據,默認大小爲4MB 。以下是幾個常用的設置持久代的JVM 參數:

-XX:PermSize=4m       設定持久代的大小

-XX:MaxPermSize=64m   設定持久代大小的最大值

-Xnoclassgc           禁止對持久代進行收集

對於年輕代和年老代的設定,是基於這樣的統計分析結果:在絕大多數的應用程序中,一些對象在創建後很快成爲了垃圾,這部分對象佔到了新創建對象的90% 以上;而另一些對象,數目相對較少,但要長期駐留在內存中;於是對於這兩種存活時間不同的對象,SUN 的JVM 將堆分出了兩個不同的區域,採用不同算法進行收集。SUN 的JVM 通過不同的收集器實現不同的收集算法。下面就詳細介紹幾種收集器,以及在這兩個代中所採用的收集器。

複製收集器 (Copying Collector ):堆被分成兩個大小相等的空間,其中一個爲活躍的空間用於分配對象,另一個爲不活躍的空間未使用;當用於分配的空間佔滿後,程序就會停止,活躍的對象被從活躍的空間複製到不活躍的空間中;複製完成後,空間的角色就會轉換,原來不活躍的空間成爲了新的活躍空間。由於活躍的對象直接被複制到不活躍的空間,所以此過程並不存在標記這個步驟。

標記- 清除收集器 (Mark and Sweep Collector ):在標記過程中,死對象所佔用的地址空間將被記錄在專門的表中;標記過程結束後,相鄰的死對象所佔的空間將合併在一起,由於此收集器不整理堆,將會產生越來越多的堆碎片。

標記- 整理收集器 (Mark and Compact Collector ):在標記過程中,給活的對象或死的對象做標記;標記過程結束後,將堆中活對象複製到堆的底部,使這些活的對象緊湊的排列在一起,避免堆碎片產生;在執行此收集過程中將停止所有應用程序線程的執行。

 

在年輕代主要採用複製收集器進行收集。實際上SUN 的JVM 對此收集器做了一些改進,它將年輕代分爲一個創建空間(eden space )和兩個殘存空間(survivor space ) 。小的收集將活的對象從創建空間和一個殘存空間複製到另一個殘存空間;然後將創建空間和另一個殘存空間看成是一個整體,分配對象;當空間被佔滿,就將活的對象從創建空間和另一個殘存空間複製到第一個殘存空間;如此反覆。若殘存空間過小,部分活的對象將溢出到年老代,從而增加了年老代的的收集頻率,由於在年老代進行的收集所花的時間遠多於在年輕代進行的收集,運行系統性能就會惡化,所以合理設置殘存空間的大小,可以對JVM 進行調優。以下是幾個常用的設置年輕代的JVM 參數:

-XX:SurvivorRatio=8         設定創建空間和殘存空間之間的大小比率

-XX:MaxTenuringThreshold=0  設定殘存空間期限閾值(Tenuring Threshold )

-XX:NewSize=size            設定年輕代的大小(字節)
-XX:MaxNewSize=size         設定年輕代的最大大小(字節)

-XX:NewRatio=2              設定年輕代和年老代之間的大小比率

 

在年老代主要採用標記- 清除收集器 和標記- 整理收集器 進行收集。

SUN 的JVM 中還有其它幾種收集器,包括增量收集 器 (Incremental Collector )、並行複製收集器 (Parallel Copying Collector )、並行清除收集器 (Parallel Scavenge Collector )和併發標記- 清除收集器 (Concurrent Mark-Sweep(CMS) Collector )等。並行複製收集器和併發標記- 清除收集器基本上是默認的複製收集器和標記- 清除收集器的併發版本。這些一般在多CPU 和大內存的條件下設置,關於並行複製收集器和併發標記- 清除收集器 的詳細介紹請查閱參考文獻([20] ),關於這些收集器的詳細介紹請查閱參考文獻([27] 、[28] 、[29] 、[31] )。

-XX:+UseParNewGC          啓用年輕代並行複製收集器,它將垃圾收集的工作分爲與CPU 數量一樣多的線程。可以和-XX:+UseConcMarkSweepGC 一起使用。

-XX:+UseParallelGC        啓用年輕代並行清除收集器,針對多處理器系統上非常大(G 字節以及更大的) 堆進行了優化。不可以和-XX:+UseConcMarkSweepGC 一起使用。

-XX:+UseConcMarkSweepGC   啓用年老代併發標記- 清除收集器,它在初始標記階段(及在以後暫短重新標記階段)暫短地停止整個系統,然後恢復用戶程序,同時垃圾收集器線程與用戶程序併發地執行

 

SUN 的JVM 作GC 時分小收集(minor collection )和大收集(major collection )。小收集只在年輕代中作GC 。大收集先在年輕代作GC ,再在年老代作GC ,因此大收集將花去更多的時間。可以通過-Xloggc:filename 和-verbose:gc 開啓GC 日誌,關於更詳細的GC 日誌設置請查閱參考文獻([29] )。

以上是對SUN 的JVM 的實現和性能調優的簡單介紹,關於這些收集器的詳細介紹請查閱參考文獻(SUN JVM 資料 )

 

    由於對象的引用方式的不同,JVM 的收集策略也不同。Java 對象的引用方式分爲:強引用(strong reference )、軟引用(soft reference )、弱引用(weak reference )和虛引用(phantom reference )。因此根據訪問方式,對象也就分爲如下4 種:

    強可及對象(strongly reachable ):可以通過強引用訪問的對象。它將一直佔有堆空間,在JVM 報告內存不足的情況下也不會釋放。

    軟可及對象(softly reachable ):不是強可及對象,並且能夠通過軟引用訪問的對象。在JVM 報告內存不足時,才考慮將它釋放;只要內存不太緊張,就會保留該對象。關於軟引用的具體運用請查閱參考文獻([13] )

    弱可及對象(weakly reachable ):不是強可及對象也不是軟可及對象,並且能夠通過弱引用訪問的對象。JVM 隨時都會將它釋放。關於弱引用的具體運用請查閱參考文獻([12] )

    虛可及對象(phantomly reachable ):不是強可及對象、軟可及對象,也不是弱可及對象,已經結束的,可以通過虛引用訪問的對象。JVM 已經執行完finalize() 方法,隨時都會將它釋放。

    對於軟引用、弱引用和虛引用的實現,java 中定義了3 個引用類:SoftReference 、WeakReference 和PhantomReference 。

SoftReference 對象或WeakReference 對象都是先將referent 域被設置爲null ;然後它們引用過的heap 對象被聲明爲 finalizable ;最後,當heap 對象的finalize() 方法被運行而且該對象佔用的內存被釋放,SoftReference 對象或WeakReference 對象就被添加到它的引用隊列(ReferenceQueue )

PhantomReference 對象與SoftReference 對象或WeakReference 對象的最大區別在於,SoftReference 對象或WeakReference 對象是在它們所引用的對象被垃圾收集器收集之後被添加到ReferenceQueue ,而PhantomReference 對象是在它所引用的對象被垃圾收集器收集之前添加到ReferenceQueue 。因此,虛可及對象存在最後一次被找回的機會。關於引用類的詳細使用請查閱參考文獻([10] 、[11] )

 

二.IBM 的JVM 介紹

 


IBM 的JVM 在1.5.0 以前,默認採用經典的三步式垃圾收集策略,即標記- 清除- 整理(mark-sweep-compact )。它沒有像SUN 的JVM 那樣將堆分成三個代,而是隻有一個區域。在堆空間底部會分配一個K 簇(k-cluster ),它是專門用來存儲“ 類塊” (class block )的區域。當K 簇滿了的情況下,在P 簇(p-cluster )中繼續分配類塊。有些對象永遠或者臨時無法移動,這些固定不動的對象就是常說的pinned 對象。P 簇就是用來存貯這些pin 對象的。新的P 簇可以被分配到任何地方而且又不能被移動,這就容易造成碎片問題。爲了解決這些問題,IBM JDK 1.4.2 版本中起用了pinnedFreeList 來改變P 簇的分配方法。同時提供了命令行參數對K 簇和P 簇的大小進行配置。關於K 簇和P 簇更詳細的介紹請查閱參考文獻([55] )。

從IBM JDK 1.5.0 開始,它的垃圾收集策略有4 種,關於垃圾收集策略的詳細介紹請查閱參考文獻([54] ):

-Xgcpolicy:optthruput  是默認策略,採用標記- 清除- 整理收集器,針對吞吐量進行優化。然而,由於標記棧大小固定並且無法設置,當堆中有大量對象生成時,顯然標記棧會不夠用,標記棧溢出(mark stack overflow )將會產生。

-Xgcpolicy:optavgpause  會啓用同步標記,針對停頓時間進行優化,這將減少暫停時間並且讓暫停時間長度在堆空間佔用率上升的時候更穩定。然而,這個參數將減少系統吞吐量大約5% ,當然這一數值將因程序不同而有一定差異。

-Xgcpolicy:gencon      分代併發,從IBM JDK 1.5.0 開始加入。類似於SUN 的JVM 的分代收集,但年老代是採用併發標記並且年輕代兩個半空間大小相等。

-Xgcpolicy:subpool     子池,這種策略只能在AIX 平臺上使用。

      除以上4 種垃圾收集策略外,還有其它參數會改變GC 的行爲:

    -Xcompactgc           強制進行整理

    -Xnocompactgc         不進行整理

-Xgcthreads           設置GC 輔助線程的個數,打開-Xgcpolicy:optavgpause 時纔有用

想要打印GC 日誌,使用-verbosegc 或-verbose:gc ,關於IBM JVM 原理的更詳細介紹請查閱參考文獻([50] 、[53] )。

 

三.SUN 的JVM   vs   IBM 的JVM

 


下面,我們就將SUN 的JVM 和IBM 的JVM 做個對比:

a. IBM 的JVM 採用標記- 清除- 整理收集器,這種方式的最大弊端就是在需要生成大量對象的應用中,標記棧會不夠用,再由於IBM 的JVM 標記棧大小固定並且無法設置,標記棧溢出將會產生;而SUN 的JVM 就不會有這樣的問題。SUN 的JVM 由於採用分代收集策略,在年輕代採用複製收集器,它不必爲生成的大量對象作標記,只是將活着的對象複製到另一個區域;而在年老代採用標記- 整理收集器,雖使用標記棧,但由於這些對象是長期存在於JVM 中的,且數量相對較少,所以不會出現標記棧溢出的問題。標記棧溢出一旦發生,系統性能將驟然下降,且無法恢復,關於標記棧溢出的詳細介紹請查閱參考文獻([53],Part 2 Garbage collection 、[51] )。IBM 自己也認識到這個收集器存在的問題,從JDK 1.5.0 開始,引入了分代收集策略,算是解決了這個問題,但SUN 的JVM 早在JDK1.3 就採了分代收集策略,不知爲何IBM 採用此方式如此之晚?

b. 在JDK 1.5.0 以前,IBM 的JVM 由於沒有分代,類的類對象和其它一些元數據不像SUN 的JVM 一樣放在持久代中,而是首先放在堆底部的K 簇中,當K 簇容納不下時,就會在堆中的可用空間中分配固定大小的P 簇來存放,這些P 簇散放在堆中,即無法收集也無法移動,所以IBM 的JVM 非常容易產生堆碎片。IBM JDK 1.4.2 版本中起用了pinnedFreeList 來改變P 簇的分配方法,在分配新的P 簇之前會作GC ,然後儘量在堆的底部分配P 簇。這種方法基本上解決了堆碎片問題。除了P 簇中存放的pinned 對象外,永遠或者臨時無法移動的對象還包括dosed 對象。pinned 對象是被native 引用的對象,包括Thread 對象、類的Class 對象;dosed 對象是被線程棧引用的對象。dosed 對象除非線程棧主動釋放,否則也無法移動。關於dosed 對象的一些信息請查閱參考文獻([53],Part 1 Object allocation;Part 2 Garbage collection )。

 

 

 

JVM 異常診斷與性能調優:

Java 程序的性能問題主要由幾方面原因造成:

1.  某些對象在運行一段時間後,佔用大量內存資源不釋放,甚至佔用內存資源越來越多,導致內存泄漏。

2.  某些線程上的某些方法由於長時間運行,佔用大量CPU 時間,導致系統性能下降。

3.  有死鎖或資源爭用的情況存在,造成某些線程長期等待。

 

對於以上性能問題的監控、診斷和分析,各個JVM 廠商以及應用服務器廠商都提供了不同的方法或工具,下面就做簡要介紹:

 

一.SUN 提供的方法和工具

Sun 的JVM 提供了多種方式對性能進行監控和分析:

1.  使用jvmstat 命令

從JDK1.4.1 開始,Sun 的JVM 支持使用命令jvmps 、jvmstat 和perfagent ;從JDK1.5.0 開始,這些命令相應變爲jps 、jstat 和jstatd 。

jps        列出系統中正在運行的JVM 實例

jstat      列出指定JVM 實例中的各個分代的使用情況,GC 運行情況等,並且此過程是實時的

jstatd     本地jstat 守護進程,可讓遠程jstat 訪問本地JVM

關於jps 、jstat 和jstatd 的更詳細的介紹請查閱([32] 、[33] )。

 

2.  生成GC 日誌

添加JVM 參數 -verbose:gc 或者 -Xloggc:filename ,生成GC 日誌。

通過分析GC 日誌可以粗略的瞭解JVM 堆的使用情況。例如,可以知道什麼時候GC 比較頻繁,說明此時java 程序正在大量分配對象;若JVM 堆的佔用不斷在增長,說明java 程序可能存在內存泄漏的情況;若GC 的執行時間非常長,可能堆的最大值設得比較小。參考資料中有一個例子說明如何分析和調優GC 性能([21] )。有一些圖形化的工具可以幫助分析GC 日誌,例如JTune 等。

爲了得到更詳細的GC 信息,可以使用如下JVM 參數:

-XX:-PrintGCDetails

-XX:-PrintGCTimeStamps

-XX:-PrintTenuringDistribution   打印出對象在放入年老代之前在年輕代做了多少次複製

關於GC 日誌的更詳細的介紹請查閱([29] 、[53] 、[54] )。

 

3.  生成hprof 文件。

通過設置不同的JVM 參數可以得到含有不同信息的hprof 文件,下面是一些比較常用的參數設置:

-agentlib:hprof=file=file,format=b  創建堆轉儲,將堆轉儲導入指定文件

-agentlib:hprof=heap=dump   創建堆轉儲,獲取堆快照

-agentlib:hprof=heap=sites   跟蹤堆的分配

-agentlib:hprof=cpu=samples 線程的CPU 佔用時間

-agentlib:hprof=cpu=times    方法的CPU 佔用時間

在JDK1.5.0 以前使用-Xrunhprof ;從JDK1.5.0 開始改用-agentlib:hprof ,-Xrunhprof 仍然可以使用。可以使用PerfAnal 或HAT 對hprof 文件進行分析。

關於hprof 的更詳細的介紹請查閱([34] 、[35] 、[36] 、[37] )。

 

4.  監控工具JConsole

從JDK1.5.0 開始,Su n提供了JVM 實時監控工具JConsole 。它是JMX 兼容的圖形化監控工具,它可以監控本地或遠程的JVM 實例。添加JVM 參數-Dcom.sun.management.jmxremote 使應用程序啓動管理代理,這樣啓動JConsole 後就可以找到這個應用並實時監控。JConsole 可以監控內存、線程、操作系統等,它可對線程進行分析並診斷出死鎖。

關於JConsole 的更詳細的介紹請查閱([38] 、[39] )。

 

二.IBM 提供的方法和工具

1.  生成的GC 日誌

添加JVM 參數-verbose:gc ,生成的GC 日誌可以用以下工具分析:

IBM Pattern Modeling and Analysis Tool for Java Garbage Collector   http://www.alphaworks.ibm.com/tech/pmat

Diagnostic Tool for Java Garbage Collector  http://www.alphaworks.ibm.com/tech/gcdiag

關於如何打印和分析GC 日誌,可參考([55],Part 3 verbosegc and command-line parameters 、[59] )

下面對最一般的GC 格式作簡單介紹:

  <GC(4): GC cycle started Fri Apr 04 14:27:20 2008

  <GC(4): freed 34873824 bytes, 84% free (451978888/536869376), in 78 ms>

  <GC(4): mark: 69 ms, sweep: 9 ms, compact: 0 ms>

  <GC(4): refs: soft 0 (age >= 32), weak 0, final 329, phantom 0>

第一行:此次GC 發生的時間;

第二行:已釋放34873824 字節,釋放完以後JVM 堆有84% 的空餘,其中堆的總大小爲536869376 字節,空閒451978888 字節,GC 用去的總時間爲78ms ;

第三行:GC 的三個階段分別用去的是時間,其中標記(mark )階段用了69ms ,清除(sweep )階段用了9ms ,整理(compact )階段用了0ms ;

第四行:在此次GC 中分別收集了多少個特殊的引用對象,其中收集的軟(soft )引用對象0 個,弱(weak )引用對象0 個,虛(phantom )引用對象0 個,以及由finalizer 線程引用的對象329 個。

 

2.  使用方法跟蹤

使用方法跟蹤,可跟蹤方法的進入、退出、輸入參數和返回值

-Dibm.dg.trc.print=mt  啓動方法跟蹤

-Dibm.dg.trc.methods  設置要跟蹤的方法,例如:

-Dibm.dg.trc.methods=java/lang/String.*  跟蹤String 所有方法的進入和退出

-Dibm.dg.trc.methods=java/lang/String.*()  跟蹤String 所有方法的進入和退出,以及輸入參數的值

-Dibm.dg.trc.methods=ArticleUI.*,! ArticleUI.get*    跟蹤ArticleUI 的所有方法,但不跟蹤以get 開頭的方法

關於方法跟蹤的更多信息,請查閱([56] Chapter 28. Using method trace,[56] Chapter 33. Tracing Java applications and the JVM )

 

3.  堆轉儲(heap dump )

JVM 收到信號、堆空間不足或在程序中調用com.ibm.jvm.Dump.HeapDump() 後都會生成heap dump 。設置如下環境變量:

IBM_HEAPDUMP/IBM_HEAP_DUMP    true                        # Enables heap dumps by means of signals.(Ctrl-/ on AIX or Linux,Ctrl-BREAK on Windows)

IBM_HEAPDUMPDIR               <your_dump_dir>             # heapdump 存放目錄

IBM_HEAPDUMP_OUTOFMEMORY      true                        # 在OutOfMemory 時生成heap dump

關於堆轉儲的更多信息,請查閱([56] Chapter 26. Using Heapdump )。

從IBM JDK1.5.0 開始,可以使用dump agent 來生成heap dump ,例如:

-Xdump:heap:events=vmstop,opts=PHD+CLASSIC               # 表示在JVM 停止時生成phd 格式和txt 格式的heap dump

-Xdump:heap:events=user,opts=PHD                         # 表示JVM 收到信號時生成heap dump

-Xdump:heap:events=throw,filter=java/lang/OutOfMem*      # 表示在OutOfMemory 時生成heap dump

-Xdump:heap:none                                         # 表示關閉所有生成heap dump 的操作

關於dump agent 的更多信息,請查閱([64] Chapter 23. Using dump agents,[64] Chapter 25. Using Heapdump )。

 

4.  線程轉儲(java dump )

嚴重的native 錯誤,JVM 收到信號,堆空間不足或在程序中調用com.ibm.jvm.Dump.JavaDump() 後都會生成java dump 。有用的環境變量設置:

DISABLE_JAVADUMP                                          # 禁用javadump ,可設成任意值

IBM_JAVACOREDIR               <your_dump_dir>             # javadump 存放目錄

IBM_JAVADUMP_OUTOFMEMORY      false                       # 在OutOfMemory 時不生成java dump

關於堆轉儲的更多信息,請查閱([56] Chapter 25. Using Javadump )。

從IBM JDK1.5.0 開始,可以使用dump agent 來生成java dump ,例如:

-Xdump:java:events=user                                   # 表示JVM 收到信號時生成java dump

-Xdump:java:events=throw,filter=java/lang/OutOfMem*       # 表示在OutOfMemory 時生成java dump

-Xdump:java:none                                          # 表示關閉所有生成java dump 的操作

關於dump agent 的更多信息,請查閱([64] Chapter 23. Using dump agents,[64] Chapter 24. Using Javadump )。

 

5.  WebSphere 提供的方法和工具

使用WebSphere 提供的wsadmin 工具獲得堆轉儲(heap dump )和線程轉儲(java dump )

wsadmin 工具的路徑:${WAS_HOME}/AppServer/bin/wsadmin.bat

在WebSphere6.1 中使用IBM JDK 1.5 ,可以使用如下命令生成java dump 和heap dump

生成heap dump 的方法如下:

  # 查找 JVM objectName :

  <wsadmin> set objectName [$AdminControl queryNames WebSphere:type=JVM,process=<servername>,node=<nodename>,*] 

  # 對 JVM MBean 調用 generateHeapDump 操作:

  <wsadmin> $AdminControl invoke $objectName generateHeapDump

 

   生成java dump 的方法如下:

  # 查找 JVM objectName :

  <wsadmin> set objectName [$AdminControl queryNames WebSphere:type=JVM,process=<servername>,node=<nodename>,*]  

  # 對 JVM MBean 調用dumpThreads 操作:

  <wsadmin> $AdminControl invoke $objectName dumpThreads

 

  在WebSphere5.1 和WebSphere6.0 中,使用IBM JDK 1.4.2 中,由於generateHeapDump 不可用,可以使用如下命令生成java dump 和heap dump

   可以在" 進程管理 -> 進程定義 -> 環境條目" 中添加以下屬性:

 IBM_HEAPDUMP                  true                        # Enables heap dumps by means of signals

    IBM_HEAP_DUMP                 true                        # Enables heap dumps by means of signals

    IBM_HEAPDUMPDIR               <your_dump_dir>             # heapdump 存放目錄

    IBM_HEAPDUMP_OUTOFMEMORY      true                        # 在OutOfMemory 時生成heap dump

    IBM_JAVADUMP_OUTOFMEMORY      true                        # 在OutOfMemory 時生成java dump

    IBM_JAVA_HEAPDUMP_TEXT        true                        # Enables heap dumps to be generated in .txt format not in .phd format

 

   生成heap dump 的方法如下:

  # 查找 JVM objectName :

  <wsadmin> set objectName [$AdminControl queryNames WebSphere:type=JVM,process=<servername>,node=<nodename>,*] 

  # 對 JVM MBean 調用dumpThreads 操作:

  <wsadmin> $AdminControl invoke $objectName dumpThreads

 

   生成java dump 的方法如下:

  # 查找 JVM objectName :

  <wsadmin> set objectName [$AdminControl queryNames WebSphere:type=JVM,process=<servername>,node=<nodename>,*] 

  按下Ctrl+Break

 

關於如何生成java dump 和heap dump ,請參考([60] 、[63 )。

分析java dump 的工具:IBM Thread and Monitor Dump Analyzer for Java    http://www.alphaworks.ibm.com/tech/jca

分析heap dump 的工具:HeapAnalyzer    http://www.alphaworks.ibm.com/tech/heapanalyzer

 


關於WebSphere 的更多診斷工具的介紹,請參考([61] )。

 

 

參考文獻:

WebSphere 系統管理

[1] WebSphere Application Server V5 系統管理:

第 1 部分:V5 管理概覽  http://www.ibm.com/developerworks/cn/websphere/techjournal/0301_williamson/williamson.html

第 2 部分:編寫您自己的管理程序  http://www.ibm.com/developerworks/cn/websphere/techjournal/0302_cundiff/cundiff.html

第 3 部分:事件通知  http://www.ibm.com/developerworks/cn/websphere/techjournal/0304_lauzon/lauzon.html

第 4 部分:如何擴展 WebSphere 管理系統  http://www.ibm.com/developerworks/cn/websphere/techjournal/0304_williamson/williamson.html

第 5 部分:程序化配置  http://www.ibm.com/developerworks/cn/websphere/techjournal/0307_wang/wang.html

第 6 部分:應用程序管理  http://www.ibm.com/developerworks/cn/websphere/techjournal/0309_apte/apte.html

[2] WebSphere 管理資料   http://blog.chinaunix.net/u/473/showart_105062.html

[3] IBM WebSphere 開發者技術期刊: WebSphere Application Server V5 高級安全性和系統加固

http://www.ibm.com/developerworks/cn/websphere/techjournal/0406_botzum/0406_botzum.html

[4] IBM InfoCenter  http://publib.boulder.ibm.com/infocenter/wasinfo/v5r1/index.jsp

[5] IBM WebSphere V5.0 Security WebSphere Handbook Series   http://publib-b.boulder.ibm.com/abstracts/sg246573.html?Open

[6] WAS 5.x 中數據源的配置使用及其常見問題   http://www.ibm.com/developerworks/cn/websphere/library/techarticles/fanggw/0406_was5ds/was5ds.html

[7] Understanding the WebSphere Application Server Web server plug-in   http://www.ibm.com/developerworks/websphere/library/techarticles/0310_cocasse/cocasse.html

[8] WebSphere 應用服務器環境搭建實踐指南   http://www.ibm.com/developerworks/cn/websphere/library/techarticles/0707_wudan/

[9] WebSphere Application Server V6.1: System Management and Configuration  http://www.redbooks.ibm.com/abstracts/sg247304.html?Open

 

GC 資料

[10]Reference Objects and Garbage Collection   http://www.pawlan.com/Monica/refobjs/

[11]Java 2 引用類使用指南   http://www.ibm.com/developerworks/cn/java/j-refs/

[12]Java 理論與實踐: 用弱引用堵住內存泄漏   http://www.ibm.com/developerworks/cn/java/j-jtp11225/

[13]Java 理論和實踐: 用軟引用阻止內存泄漏   http://www.ibm.com/developerworks/cn/java/j-jtp01246.html

[14] 垃圾收集器與Java 編程    http://www.ibm.com/developerworks/cn/java/l-JavaMemoryLeak2/

 

SUN JVM 資料

[20] 關注性能: 談論垃圾  http://www.ibm.com/developerworks/cn/java/j-perf05214/

[21] 關注性能: 調優垃圾收集  http://www.ibm.com/developerworks/cn/java/j-perf06304/

[22]Java 理論與實踐: 垃圾收集簡史 http://www.ibm.com/developerworks/cn/java/j-jtp10283/

[23]Java 理論與實踐: JVM 1.4.1 中的垃圾收集  http://www.ibm.com/developerworks/cn/java/j-jtp11253/index.html

[24]Java theory and practice: Garbage collection and performance

http://www.ibm.com/developerworks/java/library/j-jtp01274.html?S_TACT=105AGX52&S_CMP=cn-a-j

[25]Tuning Garbage Collection with the 1_4_2 Java[tm] Virtual Machine   http://java.sun.com/docs/hotspot/gc1.4.2/index.html

[26]Tuning Garbage Collection with the 5.0 JavaTM Virtual Machine  http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html

[27]Improving Java Application Performance and Scalability by Reducing Garbage Collection Times and Sizing Memory

http://developers.sun.com/mobility/midp/articles/garbage/

[28]Improving Java Application Performance and Scalability by Reducing Garbage Collection Times and Sizing Memory Using JDK 1.4.1

http://developers.sun.com/mobility/midp/articles/garbagecollection2/

[29]Java HotSpot VM Options  http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp

[30]Frequently Asked Questions about Garbage Collection in the Hotspot[TM] Java[TM] Virtual Machine

  http://java.sun.com/docs/hotspot/gc1.4.2/faq.html

[31]Turbo-charging Java HotSpot Virtual Machine, v1.4.x to Improve the Performance and Scalability of Application Servers

http://java.sun.com/developer/technicalArticles/Programming/turbo/

[32]jvmstat 3.0   http://java.sun.com/performance/jvmstat/

[33]jvmstat FAQ   http://java.sun.com/performance/jvmstat/faq.html

[34]HPROF: A Heap/CPU Profiling Tool in J2SE 5.0   http://java.sun.com/developer/technicalArticles/Programming/HPROF.html

[35]Quick Troubleshooting Tips on Windows for Java SE 5.0   http://java.sun.com/javase/6/webnotes/trouble/other/matrix5-Windows.html

[36]Quick Troubleshooting Tips on Solaris OS and Linux for Java SE 5.0   http://java.sun.com/javase/6/webnotes/trouble/other/matrix5-Unix.html

[37]PerfAnal: A Performance Analysis Tool   http://java.sun.com/developer/technicalArticles/Programming/perfanal/index.html

[38]Using JConsole to Monitor Applications   http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html

[39]Monitoring and Management Using JMX     http://java.sun.com/j2se/1.5.0/docs/guide/management/agent.html

[40] Troubleshooting Guide for Java SE 6 with HotSpot VM  http://java.sun.com/javase/6/webnotes/trouble/TSG-VM/html/index.html

[41] Troubleshooting and Diagnostic Guide for JavaTM 2 Platform, Standard Edition 5.0 http://java.sun.com/j2se/1.5/pdf/jdk50_ts_guide.pdf

 

IBM JVM 資料

[50]IBM JDK 1.4.2 的垃圾回收行爲

(一)  http://www-1.ibm.com/support/docview.wss?uid=csc1c4da5d7f9543bda44825717e00000759

(二)  http://www-1.ibm.com/support/docview.wss?uid=csc1665d3ff3ebd54e0fc825719a0027c278

[51] 優化 Java 垃圾收集的性能  http://www.ibm.com/developerworks/cn/java/i-gctroub/

Fine-tuning Java garbage collection performance  http://www.ibm.com/developerworks/ibm/library/i-gctroub/?S_TACT=105AGX52&S_CMP=cn-a-j

[52]Mash that trash -- Incremental compaction in the IBM JDK Garbage Collector

http://www.ibm.com/developerworks/ibm/library/i-incrcomp/?S_TACT=105AGX52&S_CMP=cn-a-j

[53]Sensible Sanitation -- Understanding the IBM Java Garbage Collector,

Part 1 Object allocation   http://www.ibm.com/developerworks/ibm/library/i-garbage1/

Part 2 Garbage collection   http://www.ibm.com/developerworks/ibm/library/i-garbage2/

Part 3 verbosegc and command-line parameters   http://www.ibm.com/developerworks/library/i-garbage3.html

[54] Java 技術,IBM 風格: 垃圾收集策略,第 1 部分  http://www.ibm.com/developerworks/cn/java/j-ibmjava2/

Java technology, IBM style: Garbage collection policies,

Part 1   http://www.ibm.com/developerworks/java/library/j-ibmjava2/

Part 2   http://www.ibm.com/developerworks/java/library/j-ibmjava3/

[55] 如何在IBM JDK 1.4.2 的環境中避免Java 堆空間的碎片問題  http://www-900.ibm.com/cn/support/viewdoc/detail?DocId=2447476A10000

Avoiding Java heap fragmentation with V1_4_2

http://www-1.ibm.com/support/docview.wss?rs=180&context=SSEQTP&q1=fragmentation&uid=swg21176363&loc=en_US&cs=utf-8&lang=en

[56]IBM Developer Kit and Runtime Environment, Java 2 Technology Edition, Version 1.4.2 Diagnostics Guide

http://www-128.ibm.com/developerworks/java/jdk/diagnosis/

[57]IBM 的 Java 診斷,

第 1 部分: 介紹面向 Java 的 IBM 轉儲分析器(IBM Dump Analyzer )   http://www.ibm.com/developerworks/cn/java/j-ibmtools1/

第 2 部分: 使用 Extensible Verbose Toolkit 進行垃圾收集   http://www.ibm.com/developerworks/cn/java/j-ibmtools2/

第 3 部分: 使用面向 Java 的 Lock Analyzer 診斷同步和鎖問題    http://www.ibm.com/developerworks/cn/java/j-ibmtools3/

第 4 部分: 使用分析模塊擴展 IBM Dump Analyzer for Java    http://www.ibm.com/developerworks/cn/java/j-ibmtools4/

[58]WebSphere Application Server 中的內存泄漏檢測與分析:

第 1 部分:內存泄漏概述     http://www.ibm.com/developerworks/cn/websphere/library/techarticles/0606_poddar/0606_poddar.html

第 2 部分:用於泄漏檢測與分析的工具和功能  http://www.ibm.com/developerworks/cn/websphere/library/techarticles/0608_poddar/0608_poddar.html

[59]Enabling verbose garbage collection (verbosegc) in WebSphere Application Server

    http://www-1.ibm.com/support/docview.wss?rs=180&uid=swg21114927

[60]Solving memory problems in WebSphere applications    http://www.ibm.com/developerworks/websphere/library/techarticles/0706_sun/0706_sun.html

[61]The Support Authority: Choosing the right WebSphere diagnostic tool

  http://www.ibm.com/developerworks/websphere/techjournal/0807_supauth/0807_supauth.html

[62]Preventing mark stack overflows during garbage collection in the Java SDK

  http://www-1.ibm.com/support/docview.wss?rs=180&context=SSEQTP&dc=DB520&uid=swg21164724&loc=en_US&cs=utf-8&lang=en

[63]IBM WebSphere V5.1 Performance, Scalability, and High Availability WebSphere Handbook Series

http://www.redbooks.ibm.com/abstracts/SG246198.html?Open

[64]IBM Developer Kit and Runtime Environment, Java Technology Edition, Version 5.0 Diagnostics Guide

http://www-128.ibm.com/developerworks/java/jdk/diagnosis/

[65]WebSphere Application Server V5.1 System Management and Configuration WebSphere Handbook Series

http://www.redbooks.ibm.com/abstracts/sg246195.html?Open

[66] 最大化 AIX 上的 Java 性能

第 1 部分: 基礎   http://www.ibm.com/developerworks/cn/aix/library/es-Javaperf/es-Javaperf1.html

第 2 部分: 速度需求   http://www.ibm.com/developerworks/cn/aix/library/es-Javaperf/es-Javaperf2.html

第 3 部分: 更多就是更好   http://www.ibm.com/developerworks/cn/aix/library/es-Javaperf/es-Javaperf3.html#resources

第 4 部分: 監視流量   http://www.ibm.com/developerworks/cn/aix/library/es-Javaperf/es-Javaperf4.html

第 5 部分: 參考資料和結論   http://www.ibm.com/developerworks/cn/aix/library/es-Javaperf/es-Javaperf5.html

 

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/netyeaxi/archive/2009/12/16/5020726.aspx

發佈了30 篇原創文章 · 獲贊 66 · 訪問量 65萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章