標籤:
最佳化通常包含兩方面的內容:減小代碼的體積,提高代碼的運行效率。
1.盡量指定類的final修飾符 帶有final修飾符的類是不可派生的。在Java核心API中,有許多應用final的例子,例如java.lang.String。為String類指定final防止了人們覆蓋length()方法。另外,如果指定一個類為final,則該類所有的方法都是final。Java編譯器會尋找機會內聯(inline)所有的final方法(這和具體的編譯器實現有關)。此舉能夠使效能平均提高50% 。
2、 盡量重用對象。特別是String 對象的使用中,出現字串串連情況時應用StringBuffer 代替。由於系統不僅要花時間產生對象,以後可能還需花時間對這些對象進行記憶體回收和處理。因此,產生過多的對象將會給程式的效能帶來很大的影響。
3、 盡量使用局部變數,調用方法時傳遞的參數以及在調用中建立的臨時變數都儲存在棧(Stack)中,速度較快。其他變數,如靜態變數、執行個體變數等,都在堆(Heap)中建立,速度較慢。
4,在JAVA + ORACLE 的應用系統開發中,java中內嵌的SQL語句盡量使用大寫的形式,以減輕ORACLE解析器的解析負擔
5、 Java 編程過程中,進行資料庫連接、I/O流操作時務必小心,在使用完畢後,即使關閉以釋放資源。因為對這些大對象的操作會造成系統大的開銷,稍有不慎,會導致嚴重的後果
6, 由於JVM的有其自身的GC機制,不需要程式開發人員的過多考慮,從一定程度上減輕了開發人員負擔,但同時也遺漏了隱患,過分的建立對象會消耗系統的大量記憶體,嚴重時會導致記憶體泄露,因此,保證到期對象的及時回收具有重要意義。JVM回收垃圾的條件是:對象不在被引用;然而,JVM的GC並非十分的機智,即使對象滿足了記憶體回收的條件也不一定會被立即回收。所以,建議我們在對象使用完畢,應手動置成null。
7、 在使用同步機制時,應盡量使用方法同步代替代碼塊同步。
8,盡量減少對變數的重複計算
例如:for(int i = 0;i < list.size; i ++) {
…
}
應替換為:
for(int i = 0,int len = list.size();i < len; i ++) {
…
}
9,
盡量採用lazy loading 的策略,即在需要的時候才開始建立。
例如: String str = “aaa”;
if(i == 1) {
list.add(str);
}
應替換為:
if(i == 1) {
String str = “aaa”;
list.add(str);
}
10、不要在迴圈中使用:
Try {
} catch() {
}
應把其放置在最外層。
11、StringBuffer 的使用:
StringBuffer表示了可變的、可寫的字串。
有三個構造方法 :
StringBuffer (); //預設分配16個字元的空間
StringBuffer (int size); //分配size個字元的空間
StringBuffer (String str); //分配16個字元+str.length()個字元空間
你可以通過StringBuffer的建構函式來設定它的初始化容量,這樣可以明顯地提升效能。這裡提到的建構函式是StringBuffer(int length),length參數表示當前的StringBuffer能保持的字元數量。你也可以使用ensureCapacity(int minimumcapacity)方法在StringBuffer對象建立之後設定它的容量。首先我們看看StringBuffer的預設行為,然後再找出一條更好的提升效能的途徑。
12,當複製大量資料時,使用System.arraycopy()命令。
13,在JSP頁面中關閉無用的會話。
一個常見的誤解是以為session在有用戶端訪問時就被建立,然而事實是直到某server端程式調用HttpServletRequest.getSession(true)這樣的語句時才被建立,注意如果JSP沒有顯示的使用 <%@page session="false"%> 關閉session,則JSP檔案在編譯成Servlet時將會自動加上這樣一條語句HttpSession session = HttpServletRequest.getSession(true);這也是JSP中隱含的session對象的來曆。由於session會消耗記憶體資源,因此,如果不打算使用session,應該在所有的JSP中關閉它。
對於那些無需跟蹤工作階段狀態的頁面,關閉自動建立的會話可以節省一些資源。使用如下page指令:<%@ page session="false"%>
14,Servlet與記憶體使用量
許多開發人員隨意地把大量資訊儲存到使用者會話之中。一些時候,儲存在會話中的對象沒有及時地被記憶體回收機制回收。從效能上看,典型的癥狀是使用者感到系統周期性地變慢,卻又不能把原因歸於任何一個具體的組件。如果監視JVM的堆空間,它的表現是記憶體佔用不正常地大起大落。
解決這類記憶體問題主要有二種辦法。第一種辦法是,在所有作用範圍為會話的Bean中實現HttpSessionBindingListener介面。這樣,只要實現valueUnbound()方法,就可以顯式地釋放Bean使用的資源。 另外一種辦法就是儘快地把會話作廢。大多數應用伺服器都有設定會話作廢間隔時間的選項。另外,也可以用編程的方式調用會話的setMaxInactiveInterval()方法,該方法用來設定在作廢會話之前,Servlet容器允許的客戶請求的最大間隔時間,以秒計。
15,選擇合適的引用機制 在典型的JSP應用系統中,頁頭、頁尾部分往往被抽取出來,然後根據需要引入頁頭、頁尾。當前,在JSP頁面中引入外部資源的方法主要有兩種:include指令,以及include動作。
include指令:例如<%@ include file="copyright.html" %>。該指令在編譯時間引入指定的資源。在編譯之前,帶有include指令的頁面和指定的資源被合并成一個檔案。被引用的外部資源在編譯時間就確定,比運行時才確定資源更高效。
include動作:例如<jsp:include page="copyright.jsp" />。該動作引入指定頁面執行後產生的結果。由於它在運行時完成,因此對輸出結果的控制更加靈活。但時,只有當被引用的內容頻繁地改變時,或者在對首頁面的請求沒有出現之前,被引用的頁面無法確定時,使用include動作才合算。
16,不要將數組聲明為:public static final
17,array(數組) 和 ArryList的使用
array([]):最高效;但是其容量固定且無法動態改變;
ArrayList:容量可動態增長;但犧牲效率;
18,盡量使用HashMap 和ArrayList ,除非必要,否則不推薦使用HashTable和Vector ,後者由於使用同步機制,而導致了效能的開銷。
java代碼最佳化