淺談AIX環境下的Java效能調優

gangyaocn發表於2010-02-08

from IBM

Java 效能準則

在編寫Java應用程式時,以下是基本的準則:

  • 使用字串緩衝區而不是字串連線,當進行連續字串操作時要避免不必要地建立那些最終必須經過垃圾回收的物件。
  • 避免連續寫入 Java 控制檯以減少字串操作、文字格式化以及輸出的花費。
  • 必要時透過使用變數的原語型別來避免物件建立和操作的花費。
  • 經常快取記憶體用過的物件以減少必須的垃圾回收數量,並且避免重複建立物件的需求。
  • 儘可能分組本地操作以減少 Java 本地介面(JNI)的呼叫。
  • 只有在必要時再使用同步方法,以此限制在 JVM 和作業系統中的多工。
  • 除非必要避免呼叫垃圾回收器。如果您必須呼叫它,只有在空閒時間或一些非關鍵階段再這樣做。
  • 可能時使用整型而不是長整型,因為 32 位操作快於 64 位。
  • 可能時申明方法為 final。JVM 處理 final 的方法較好。
  • 當建立常量時為了減少變數需要初始化的次數,使用關鍵字 static final。
  • 避免不必要的“casts”和“instanceof”引用,因為在 Java 中銷燬操作不是在編譯時而是在執行時執行的。
  • 當陣列可以滿足要求時儘可能避免使用向量。
  • 從向量末端新增和刪除項以得到較高效能。
  • 使用 -O 選項編譯 Java 檔案。
  • 避免在迴圈中分配物件。
  • 使用緩衝區 I/O 並調優緩衝區大小。
  • 使用連線池和準備快取宣告進行資料庫訪問。
  • 使用連線池連線到資料庫並重用連線而不是重複開啟和關閉連線。
  • 最大化執行緒生存期並最小化執行緒建立和銷燬迴圈。
  • 最小化共享資源的爭用。
  • 最小化短生存期物件的建立。
  • 避免遠端方法呼叫。
  • 使用回撥以避免阻塞遠端方法呼叫。
  • 避免建立只用來訪問一個方法的物件。
  • 儘可能保持同步方法處於迴圈外。
  • 在資料庫中以 Unicode 形式儲存字串和字元資料。
  • 記錄 CLASSPATH 以便最常用的庫先出現。

監視 Java

在AIX 作業系統中有許多工具可以用來監視Java應用程式的效能,以下是簡單的概述。

vmstat
這條命令提供了各種系統資源的資訊。它報告了執行佇列以及等待佇列中核心執行緒的統計資訊、記憶體使用、頁面排程空間、磁碟 I/O、中斷、系統呼叫、上下文切換以及 CPU 活動。

iostat
這條命令報告了詳細的磁碟 I/O 資訊。

topas
這條命令報告了 CPU、網路、磁碟 I/O、工作負載管理器和程式活動。

tprof -k -s -e -x "sleep 10"
這條命令可被用來剖析應用程式以查明任何可能影響效能的活動程式/方法。

ps -mo 執行緒
這條命令顯示了一個程式或執行緒繫結於哪一個 CPU。

java -verbose:gc
這個選項可被用來檢查垃圾回收對您的應用程式的衝擊。它報告了垃圾回收所花的總共時間,平均每一次垃圾回收花費時間,平均每一次垃圾回收收集的記憶體以及平均每一次垃圾回收中的物件數。

Java應用程式效能調優

建議在執行Java應用的AIX使用者環境下,設定以下環境變數。

AIXTHREAD_SCOPE=S
用 AIX 4.3.1 啟動,此變數預設值為 P。這表示程式寬度爭用作用域(M:N)。對於 Java 應用程式,您應該設定這個值為 S,它表示系統寬度爭用作用域(1:1)。

AIXTHREAD_MUTEX_DEBUG=OFF
用偵錯程式為使用目的維持一個活動人工干預列表。

AIXTHERAD_COND_DEBUG=OFF
用偵錯程式為使用目的維持一個條件變數列表。

AIXTHREAD_RWLOCK_DEBUG=OFF
pthreads 庫用偵錯程式為使用目的維護一個包含活動互斥鎖定、條件變數以及讀/寫鎖定的列表。當一個鎖定初始化,如果列表中沒有這一鎖定,它被加入到列表中。此列表以 連結串列形式實現,因此當列表變大時透過搜尋它來確定一個鎖定是否存在就包含了效能問題。問題是此列表被鎖定保護,這一鎖定在搜尋操作過程中一直保持。當搜尋 進行時其它對 pthread_mutex_init() 呼叫的子例程必須等待。為了最佳化效能,您應當將此執行緒除錯選項設定為 OFF。它們的預設值為 ON 。

SPINLOOPTIME=500
spinloop 時間是一個程式在阻塞前在一個繁忙的鎖定上可以迴圈的次數。這個值預設設定為 40。如果 tprof 輸出表明 check_lock 例程具有高的 CPU 使用率,並且如果通常鎖定在短時間內可用,您應當透過將值設定為 500 或更高來提高迴圈時間。

同樣,執行Java應用的AIX使用者環境下,推薦以下設定:
l ulimit -d 不限制
l ulimit -m 不限制
l ulimit -n 不限制
l ulimit -s 不限制

作業系統內一定的環境引數和設定可以用來調優 Java 效能。同樣,許多調優系統部件如 CPU、記憶體、網路、I/O 等等的技術,可以提高 Java 效能。

為了使得 Java 的效能和可伸縮性儘可能的好,您應當使用最新可用版本的作業系統和 Java,以及Just-In-Time(JIT)編譯器。

與 Java 相關的最普通的效能問題與垃圾回收機制有關。如果 Java 堆太大,則堆將必須駐留在主記憶體外。這將導致頁面排程活動增加,它將影響 Java 效能。同樣,一個大的堆可能花很多秒去填充。這意味著,儘管垃圾回收活動不頻繁,但與垃圾回收相聯絡的暫停次數將增加。為了調優 Java 虛擬機器(JVM)的堆,使用 java 命令加選項 -ms 或 -mx。使用垃圾回收統計資訊來幫助決定最佳設定。[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26651/viewspace-1031175/,如需轉載,請註明出處,否則將追究法律責任。

相關文章