2014年2月7日 星期五

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



本文介紹什麼是Java,AIX下的Java版本,Java的性能準則,AIX提供的監視Java的工具,以及如何在AIX用戶環境下進行Java應用程式性能調優。
1、什麼是Java
Java
是一種物件導向的程式設計語言。它以 C++ 為模型,被設計成小的、簡單的、在源和二進位級別跨平臺的可移植的語言,Java 程式(applets 和應用程式)可以運行於任何已經安裝了 Java 虛擬機器(JVM)的機器上。Java 相對其它電腦語言有顯著的優勢,適合於任何程式設計任務,Java 有以下優勢:
Java 是獨立於平臺的:Java 最顯著的一個優勢就是它輕易從一台電腦系統移動到另一台的能力。對於任何Web軟體至關重要的就是在許多不同系統上運行同一個程式的能力, Java 成功之處在於在源和二進位級別能夠獨立於平臺。
Java 是物件導向的:Java 的另外一個優點在於利用物件導向的方法。這允許你創建模組化程式和可重用代碼。
Java 容易學習:Java 被設計成容易使用的語言,因此它更易於寫、編譯、調試以及學習。
Java 是電子商務的解決方案: 由於 Java 的健壯性、使用方便、跨平臺的能力和安全性特點,它已成為了提供世界範圍內網際網路解決方案的選擇語言。

2AIX環境下的Java版本
目前,AIX作業系統可以支援多個Java版本,可以在一個作業系統下同時安裝多個Java版本,應用需要哪個版本時,可設置PATH路徑到此版本所在的目錄。以下是AIX可支援的Java版本資訊:
Java 1.1.8
Java 1.2.2
Java 1.3.0
Java 1.3.1 32bit
Java 1.3.1 64bit
Java 1.4 32bit
Java 1.4 64bit
從性能來看,儘量使用高版本的AIX和高版本的Java,並且安裝最新的作業系統和Java補丁包。當需要超過2GBJava 堆時,需要使用64bitJava。在AIX環境下,Java是免費使用的,可以從下列網址下載Java軟體:
http://www6.software.ibm.com/dl/dka/dka-p
從下列網址下載AIX作業系統和Java的補丁包:
http://techsupport.services.ibm.com/server/fixes.

3Java 性能準則
在編寫Java應用程式時,以下是基本的準則:
  • 使用字串緩衝區而不是字元串連接,當進行連續字串操作時要避免不必要地創建那些最終必須經過垃圾回收的物件。
  • 避免連續寫入 Java 控制台以減少字串操作、文本格式化以及輸出的花費。
  • 必要時通過使用變數的原語類型來避免物件創建和操作的花費。
  • 經常快取記憶體用過的物件以減少必須的垃圾回收數量,並且避免重複創建物件的需求。
  • 盡可能分組本地操作以減少 Java 本地介面(JNI)的調用。
  • 只有在必要時再使用同步方法,以此限制在 JVM 和作業系統中的多工。
  • 除非必要避免調用垃圾回收器。如果您必須調用它,只有在閒置時間或一些非關鍵階段再這樣做。
  • 可能時使用整型而不是長整型,因為 32 位操作快於 64 位。
  • 可能時申明方法為 finalJVM 處理 final 的方法較好。
  • 當創建常量時為了減少變數需要初始化的次數,使用關鍵字 static final
  • 避免不必要的“casts”“instanceof”引用,因為在 Java 中銷毀操作不是在編譯時而是在運行時執行的。
  • 當陣列可以滿足要求時盡可能避免使用向量。
  • 從向量末端添加和刪除項以得到較高性能。
  • 使用 -O 選項編譯 Java 檔。
  • 避免在迴圈中分配物件。
  • 使用緩衝區 I/O 並調優緩衝區大小。
  • 使用連接池和準備緩存聲明進行資料庫訪問。
  • 使用連接池連接到資料庫並重用連接而不是重複打開和關閉連接。
  • 最大化執行緒生存期並最小化執行緒創建和銷毀迴圈。
  • 最小化共用資源的爭用。
  • 最小化短生存期物件的創建。
  • 避免遠程方法調用。
  • 使用回檔以避免阻塞遠端方法調用。
  • 避免創建只用來訪問一個方法的物件。
  • 盡可能保持同步方法處於迴圈外。
  • 在資料庫中以 Unicode 形式存儲字串和字元資料。
  • 記錄 CLASSPATH 以便最常用的庫先出現。
4、監視 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
這個選項可被用來檢查垃圾回收對您的應用程式的衝擊。它報告了垃圾回收所花的總共時間,平均每一次垃圾回收花費時間,平均每一次垃圾回收收集的記憶體以及平均每一次垃圾回收中的物件數。 

5Java應用程式性能調優
建議在運行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-TimeJIT)編譯器。
Java 相關的最普通的性能問題與垃圾回收機制有關。如果 Java 堆太大,則堆將必須駐留在主記憶體外。這將導致頁面調度活動增加,它將影響 Java 性能。同樣,一個大的堆可能花很多秒去填充。這意味著,儘管垃圾回收活動不頻繁,但與垃圾回收相聯繫的暫停次數將增加。為了調優 Java 虛擬機器(JVM)的堆,使用 java 命令加選項 -ms -mx。使用垃圾回收統計資訊來説明決定最佳設置。

沒有留言:

張貼留言