Java性能優化技巧集錦(1,2,3,4,5,6) 原文鏈接:http://edu.codepub.com/2010/0210/20413.php
一、通用篇
1.1 不用new關鍵詞創建類的實例
1.2 使用非阻塞I/O
1.3 慎用異常
1.4 不要重復初始化變量
1.5 盡量指定類的final修飾符
1.6 盡量使用局部變量
1.7 乘法和除法
二、J2EE篇
一、通用篇
1.1 不用new關鍵詞創建類的實例
1.2 使用非阻塞I/O
1.3 慎用異常
1.4 不要重復初始化變量
1.5 盡量指定類的final修飾符
1.6 盡量使用局部變量
1.7 乘法和除法
二、J2EE篇
2.1 使用緩沖標記
2.2 始終通過會話Bean訪問實體Bean
2.3 選擇合適的引用機制
2.4 在部署描述器中設置只讀屬性
2.5 緩沖對EJB Home的訪問
2.6 為EJB實現本地接口
2.7 生成主鍵
2.8 及時清除不再需要的會話
2.9 在JSP頁面中關閉無用的會話
2.10 Servlet與內存使用
2.11 HTTP Keep-Alive
2.12 JDBC與Unicode
2.13 JDBC與I/O
1.14 內存數據庫
三、GUI篇
3.1 用JAR壓縮類文件
3.2 提示Applet裝入進程
3.3 在畫出圖形之前預先裝入它
3.4 覆蓋update方法
3.5 延遲重畫操作
3.6 使用雙緩沖區
3.7 使用BufferedImage
3.8 使用VolatileImage
3.9 使用Window Blitting
四、補充資料
===================================
正文:
===================================
一、通用篇
“通用篇”討論的問題適合于大多數Java應用。
1.1 不用new關鍵詞創建類的實例
用new關鍵詞創建類的實例時,構造函數鏈中的所有構造函數都會被自動調用。但如果一個對象實現了Cloneable接口,我們可以調用它的clone()方法。clone()方法不會調用任何類構造函數。
在使用設計模式(Design Pattern)的場合,如果用Factory模式創建對象,則改用clone()方法創建新的對象實例非常簡單。例如,下面是Factory模式的一個典型實現:
public static Credit getNewCredit() {
return new Credit();
}
改進后的代碼使用clone()方法,如下所示:
private static Credit BaseCredit = new Credit();
public static Credit getNewCredit() {
return (Credit) BaseCredit.clone();
}
上面的思路對于數組處理同樣很有用。
1.2 使用非阻塞I/O
版本較低的JDK不支持非阻塞I/O API。為避免I/O阻塞,一些應用采用了創建大量線程的辦法(在較好的情況下,會使用一個緩沖池)。這種技術可以在許多必須支持并發I/O流的應用中見到,如Web服務器、報價和拍賣應用等。然而,創建Java線程需要相當可觀的開銷。
JDK 1.4引入了非阻塞的I/O庫(java.nio)。如果應用要求使用版本較早的JDK,在這里有一個支持非阻塞I/O的軟件包。
請參見Sun中國網站的《調整Java的I/O性能》。
1.3 慎用異常
異常對性能不利。拋出異常首先要創建一個新的對象。Throwable接口的構造函數調用名為fillInStackTrace()的本地(Native)方法,fillInStackTrace()方法檢查堆棧,收集調用跟蹤信息。只要有異常被拋出,VM就必須調整調用堆棧,因為在處理過程中創建了一個新的對象。
異常只能用于錯誤處理,不應該用來控制程序流程。
1.4 不要重復初始化變量
默認情況下,調用類的構造函數時, Java會把變量初始化成確定的值:所有的對象被設置成null,整數變量(byte、short、int、long)設置成0,float和 double變量設置成0.0,邏輯值設置成false。當一個類從另一個類派生時,這一點尤其應該注意,因為用new關鍵詞創建一個對象時,構造函數鏈中的所有構造函數都會被自動調用。
1.5 盡量指定類的final修飾符
帶有final修飾符的類是不可派生的。在Java核心API中,有許多應用final的例子,例如java.lang.String。為String類指定final防止了人們覆蓋length()方法。
另外,如果指定一個類為final,則該類所有的方法都是final。Java編譯器會尋找機會內聯(inline)所有的final方法(這和具體的編譯器實現有關)。此舉能夠使性能平均提高50%。
1.6 盡量使用局部變量
調用方法時傳遞的參數以及在調用中創建的臨時變量都保存在棧(Stack)中,速度較快。其他變量,如靜態變量、實例變量等,都在堆(Heap)中創建,速度較慢。另外,依賴于具體的編譯器/JVM,局部變量還可能得到進一步優化。請參見《盡可能使用堆棧變量》。
1.7 乘法和除法
考慮下面的代碼:
for (val = 0; val < 100000; val +=5) { alterX = val * 8; myResult = val * 2; }
用移位操作替代乘法操作可以極大地提高性能。下面是修改后的代碼:
for (val = 0; val < 100000; val += 5) { alterX = val << 3; myResult = val << 1; }
修改后的代碼不再做乘以8的操作,而是改用等價的左移3位操作,每左移1位相當于乘以2。相應地,右移1位操作相當于除以2。值得一提的是,雖然移位操作速度快,但可能使代碼比較難于理解,所以最好加上一些注釋。
本篇文章來源于:開發學院 http://edu.codepub.com 原文鏈接:http://edu.codepub.com/2010/0210/20413.php
posted on 2010-05-17 17:58 w@ns0ng 閱讀(183) 評論(0) 編輯 收藏 所屬分類: J2EE