01.盡量避免隨意使用靜態變數
當某個對象被定義為stataic變數所引用,那麼gc通常是不會回收這個對象所佔有的記憶體,如:
1: public class A{
2: static B b = new B();
3: }
此時靜態變數b的生命週期與A類同步,如果A類不會卸載,那麼b對象會常駐記憶體,直到程式終止。
02.盡量避免過多過常的建立java對象
盡量避免在經常調用的方法,迴圈中new對象,由於系統不僅要花費時間來建立對象,而且還要花時間對這些對象進行記憶體回收和處理,在我們可以控制的範圍內,最大限度的重用對象,最好能用基本的資料類型或數組來替代對象。
03.盡量使用final修飾符
帶有final修飾符的類是不可派生的。如果一個類是final的,則該類所有方法都是final的。java編譯器會尋找機會內聯 (inline)所有的final方法(這和具體的編譯器實現有關)。此舉能夠使效能平均提高50%。
04.盡量使用局部變數
調用方法時傳遞的參數以及在調用中建立的臨時變數都儲存在棧(Stack)中,速度較快。其他變數,如靜態變數,執行個體變數等,都在堆(Heap)中建立,速度較慢。
05.盡量使用StringBuilder和StringBuffer進行字串串連
但是使用時也是最好先指定容量。例如StringBuffer 的構造器會建立一個預設大小(通常是16)的字元數組。在使用中,如果超出這個大小,就會重新分配記憶體,建立一個更大的數組,並將原先的數組複製過來,再丟棄舊的數組。在大多數情況下,你可以在建立 StringBuffer的時候指定大小,這樣就避免了在容量不夠的時候自動成長,以提高效能。
06.單線程應盡量使用HashMap, ArrayList 07.盡量合理的建立HashMap
當你要建立一個比較大的hashMap時,充分利用另一個建構函式 public HashMap(int initialCapacity, float loadFactor),避 免HashMap多次進行了hash重構,擴容是一件很耗費效能的事,在預設中initialCapacity只有16,而loadFactor是 0.75,需要多大的容量,你最好能準確的估計你所需要的最佳大小,同樣的Hashtable,Vectors也是一樣的道理。
08.盡量減少對變數的重複計算
如
1: for(int i=0; i<list.size(); i++)
應該改為
1: for(int i = 0, len = list.size(); i < len; i++)
或
1: for(int i = list.size() - 1; i >= 0; i—)
並且在迴圈中應該避免使用複雜的運算式,在迴圈中,迴圈條件會被反覆計算,如果不使用複雜運算式,而使迴圈條件值不變的話,程式將會啟動並執行更快。
09.盡量避免使用二維數組
二維資料佔用的記憶體空間比一維數組多得多,大概10倍以上。
10.ArrayList & LinkedList
一個是線性表,一個是鏈表,理解資料結構的應該知道有什麼區別,注意對症下藥。
11.盡量使用System.arraycopy()代替通過來迴圈複製數組
System.arraycopy() 要比通過迴圈來複製數組快的多。
12.移位元運算
對於“/”、”*”操作,使用移位的操作將會更快和更有效。
13.盡量早釋放無用對象的引用
大部分時,方法局部引用變數所引用的對象 會隨著方法結束而變成垃圾,因此,大部分時候程式無需將局部,引用變數顯式設為null。當局部變數不需要時,不需明顯的設為null,因為一個方法執行完畢時,這些引用會自動被清理。但是針對下面的情況:
1: Public void test(){
2: Object obj = new Object();
3: ……
4: Obj=null;
5: //執行耗時,耗記憶體操作;或調用耗時,耗記憶體的方法
6: ……
7: }
這時候就可以將obj賦值為null,可以儘早的釋放對Object對象的引用。Obj=null;只是告訴jvm這個對象已經成為垃圾,至於什麼時候回收,還不能確定。
14.盡量避免使用split
除非是必須的,否則應該避免使用split,split由於支援Regex,所以效率比較低,如果是頻繁的幾十,幾百萬的調用將會耗費大量資源,如果確實需頻繁的調用split,可以考慮使用apache的StringUtils.split(string,char),頻繁split的可以緩衝結果。
15.盡量緩衝經常使用的對象
儘可能將經常使用的對象進行緩衝,可以使用數組,或HashMap的容器來進行緩衝,但這種方式可能導致系統佔用過多的緩衝,效能下降,推薦可以使用一些第三方的開源工具,如EhCache,Oscache進行緩衝,他們基本都實現了FIFO/FLU等緩衝演算法。