1. 程式人生 > >java效能調優的一些方法

java效能調優的一些方法

在不斷地開發過程中,我們不再只是侷限於實現功能,我們慢慢開始著眼於提高程式碼的質量,提高程式的效能。程式碼優化就成了一個我們所關注的問題,或許你一開始對java效能調優無從下手,那我們今天就從最基礎的小的細節開始做起,正如1.1的一百次方就成了13780.6123,從每個小的優化做起,從而對系統的效能就是一個質的優化。

1.說一個我們平時最常用的String字串,如果需要用到字串拼接的時候,我們儘量選擇StringBuffer和StringBuilder代替。因為直接用String拼接字串,會使java虛擬機器花費時間去建立較多的物件,之後還需要花費時間去回收處理這些物件,而且生成過多的物件會給效能帶來比較大的影響。

2.儘量減少對變數的重複計算。下面舉個我們最常用的例子。我們在使用for迴圈的時候,是否經常會這樣寫

for(int i =0; i<list.size(); i++)

這樣每迴圈一次都會對list的size計算一次,如果我們寫成這樣:

for(int i =0, int length = list.size(); i< length; i++)

這樣只需要對list的size計算一次,在list.size()很大的情況下,就可以減少很多消耗了。

3.及時關閉流。在進行資料庫連線和I/O流操作的時候,使用完畢之後,及時關閉流以及釋放資源,因為對這些大物件的操作會造成系統較大的開銷。

4.不在迴圈內建立物件和呼叫sql語句。先說建立物件的情況,這樣會使記憶體中存在N個物件的引用,如果N足夠大的話,就非常消耗記憶體了。你可以把上面的程式碼改成下面的:

for(int i=0, int length = list.size(); i<length; i++){
    Object o = new Object();
}

Obeject o = null;
for(int i=0, int length = list.size(); i<length; i++ ){
    0 = new Object();
}

5.儘量避免隨意使用靜態變數,因為當某個物件被定義為static的變數所引起,那麼GC通常不會回收這個物件所佔的堆記憶體,靜態變數的生命週期會和其所在類相同。

6.使用資料庫連線池和執行緒池。這兩個池都是重用物件的,資料庫連線池可以避免頻繁的開啟和關閉連線,而執行緒池可以避免頻繁的建立和銷燬執行緒。

7.使用帶快取的輸入輸出流對I/O進行操作。即使用BufferedReader、BufferedWriter、BufferedInputStream、BufferedOutputStream,這可以極大地提升IO效率。

8.程式執行中避免使用反射。反射是java提供給使用者一個強大的功能,功能強大往往意味著效率不高。不建議在程式執行過程中使用尤其是頻繁使用反射機制, 特別是Method的invoke方法,如果確實有必要,一種建議性的做法是將那些需要通過反射載入的類在專案啟動的時候通過反射例項化出一個物件並放入 記憶體—-使用者只關心和對端互動的時候獲取最快的響應速度,並不關心對端的專案啟動花多久時間。

9.建立容器的時候給定一個大概的容量,因為擴容是個一個非常消耗效能的過程。

10.用try…catch…包含會丟擲異常的程式碼塊,而不是一整個程式碼塊。並且不要在迴圈中使用try…catch…應該把它放在最外層。

11.慎用異常。異常對效能不利。丟擲異常首先要建立一個新的物件,Throwable介面的建構函式呼叫名為fillInStackTrace()的本地同步方 法,fillInStackTrace()方法檢查堆疊,收集呼叫跟蹤資訊。只要有異常被丟擲,Java虛擬機器就必須調整呼叫堆疊,因為在處理過程中建立 了一個新的物件。異常只能用於錯誤處理,不應該用來控制程式流程。

12.公用的集合類中不使用的資料一定要及時remove掉。如果一個集合類是公用的(也就是說不是方法裡面的屬性),那麼這個集合裡面的元素是不會自動釋放的,因為始終有引用指向它們。所以,如果公用集合裡面的某些資料不使用而不去remove掉它們,那麼將會造成這個公用集合不斷增大,使得系統有記憶體洩露的隱患。

13.避免使用遞迴。現在,類似Scala這樣的函數語言程式設計語言都鼓勵使用遞迴。因為遞迴通常意味著能分解到單獨個體優化的尾遞迴(tail-recursing)。如果你使用的程式語言能夠支援那是再好不過。不過即使如此,也要注意對演算法的細微調整將會使尾遞迴變為普通遞迴。希望編譯器能自動探測到這一點,否則本來我們將為只需使用幾個本地變數就能搞定的事情而白白浪費大量的堆疊框架(stack frames)。

以上就是我平時開發以及閱覽部落格所總結的一些方法,希望能幫到大家吧。