java效能最佳化策略

來源:互聯網
上載者:User

· 當進行過多的字串操作以避免不必要地建立那些最終必須經曆垃圾收集的對象時,可使用 StringBuffer 功能而不是字串共置。
· 避免連續寫入 Java 控制台以減少字串操作、文字格式設定化以及輸出的花費。
· 必要時通過使用變數的原語類型來避免對象建立和操作的花費。
· 對常用對象進行快取,以減少必須的垃圾收集量,並避免重新建立對象的需要。
· 儘可能分組本地操作以減少 Java 本地介面(JNI)的調用。
· 僅當在 JVM 和作業系統中必須限制多任務時才使用同步方法。
· 除非必要避免調用記憶體回收行程。如果您必須調用它,只有在空閑時間或一些非關鍵階段再這樣做。
· 儘可能使用整型而不是長整型,因為 32 位操作的執行快於 64 位元操作。
· 儘可能聲明方法為 final。JVM 可較好地處理 final 方法。
· 在建立常量以減少需要初始設定變數的次數時請使用關鍵字 static final。
· 避免不必要的“casts”和“instanceof”引用,因為 Java 中的資料類型轉換是在運行時完成的。
· 當數組可以滿足要求時儘可能避免使用向量。
· 把項添加到向量尾部或從向量尾部刪除項。
· 使用 -O 選項編譯 Java 檔案。
· 避免在迴圈中指派至。
· 使用緩衝區 I/O 並調整緩衝區大小。
· 使用串連池和準備緩衝聲明進行資料庫訪問。
· 使用串連池串連到資料庫並重用串連而不是重複開啟和關閉串連。
· 最大化和最小化線程建立和銷毀周期。
· 最小化共用資源的爭用。
· 最小化短生命週期對象的建立。
· 避免遠程方法調用。
· 使用回調以避免阻塞遠程方法調用。
· 避免建立僅用於存取方法的對象。
· 保持同步方法處於迴圈外。
· 在資料庫中以 Unicode 形式儲存字串和字元資料。
· 對 CLASSPATH 重新排序使得最常用的庫先出現。
· 避免在迴圈條件中使用複雜運算式。
· 使用"System.arraycopy()"代替迴圈來複製數組。
· 讓訪問執行個體的內變數的getter/setter方法變成"final"。
· 使用位移運算來代替"a/b"和"a*b"。
· 不在迴圈中調用synchronized方法。
· 將try/catch塊移出迴圈。
· 對於boolean值,要避免不必要的等式判斷。
· 用StringTokenizer來代替"indexOf()"和"subStrng"等字串分析方法。
· 多多使用 x? y:z 來代替條件判斷
· 不在迴圈體中執行個體化變數
· 確定StringBuffer的容量
· 儘可能的使用棧變數
· 盡量不使用取反操作(!)
· 盡量與一個介面進行instanceof操作而不是一個類
· 解析XML的時候,如果不需要序列化、驗證可以考慮使用XPP模型(XML Pull    Parser(XPP) )http://www.extreme.indiana.edu/soap/xpp/
·針對Map元素操作時於某種原因要建立一個集合元素的數組而非迭代這些元素,則應使用該數組迭代元素。 但如果您不需要此中間數組,則不要建立它,而是使用 Iterator 迭代元素。
int mapsize = aMap.size();
Iterator keyValuePairs1 = aMap.entrySet().iterator();
for (int i = 0; i < mapsize; i++)
{
  Map.Entry entry = (Map.Entry) keyValuePairs1.next();
  Object key = entry.getKey();
  Object value = entry.getValue();
  ...
}
建議使用:
Object[] keyValuePairs2 = aMap.entrySet().toArray();
for (int i = 0; i < rem; i++) {
{
  Map.Entry entry = (Map.Entry) keyValuePairs2[i];
  Object key = entry.getKey();
  Object value = entry.getValue();
  ...
}
·Map 通常適合按鍵(而非按值)進行訪問.對使用 containsKey() 和 containsValue() 遍曆 HashMap 中所有元素所需時間的測試表明,containsValue() 所需的時間要長很多
·取的雜湊值的是很可以考慮使用
int hashvalue = (key.hashCode() & 0x7FFFFFFF) % table.length;
它實質上等於
int hashvalue = Maths.abs(key.hashCode()) % table.length;
但使用更快機制擷取正值的同一函數
·調整Map的大小,使用(capacity)Map 的預設大小將引發多次調整大小操作,開銷很大,在伺服器模式(java -server)下要多用 50% 的時間,而在用戶端模式下幾乎要多用兩倍的時間!奇數個儲存桶使 map 能夠通過減少衝突數來提高執行效率
·申明Map變數的是很盡量使用介面申明:如:
Map criticalMap = new HashMap(); //好
HashMap criticalMap = new HashMap(); //差

·JDK5.0版本以上的JVM 可以在運行程式的時候設定(java --XX:PermSize=128m
)來改善提高堆分配和記憶體回收效率(當有很多class將要被載入到VM的程式)

·在將要進行迴圈時,當collection對象能夠使用collection.size()得到大小就不要使用Iterator.hasNext()和Enumerator.hasMoreElements()來取得。

·String.equals()不單單能判斷2個字串是否相等,也能更有效率的判斷該字串的長度是否為0

·使用I/O操作時要選擇有Buffered I/O classes

·使用private和static的方法以及final classes ,他們能在編譯的時候變成內聯的形式。

·盡量使用JAR 或 ZIP 檔案

·從String類型建立Doubles類型非常慢

可以通過觀查位元組碼找的最佳化點,觀查位元組碼的步驟:
javac -g Demo.java
javap -c -p Demo
位元組碼的意義可以到JDK Documents上面找
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.