1.盡量減少對變量的重複計算
明确一個概念,對方法的調用,即使方法中隻有一句語句,也是有消耗的,包括建立棧幀、調用方法時保護現場、調用方法完畢時恢複現場等。例如下面的操作:
建議修改為:在list.size()很大的時候,就減少了很多的消耗
2.盡量采用懶加載的政策(即在需要的時候才建立)
例如下面的操作:
建議修改為:
3.循環内不要不斷建立對象引用
例如下面操作:
這種做法會導緻記憶體中有count份Object對象引用存在,count很大的話,就耗費記憶體了,建議修改為:
4.盡量避免随意使用靜态變量
要知道,當某個對象被定義為static的變量所引用,那麼GC通常是不會回收這個對象所占有的堆記憶體的。
此時靜态變量b的生命周期與A類相同,如果A類不被解除安裝,那麼引用B指向的B對象會常駐記憶體,直到程式終止。
5.慎用異常
異常對性能不利。抛出異常首先要建立一個新的對象,Throwable接口的構造函數調用名為fillInStackTrace()的本地同步方法,fillInStackTrace()方法檢查堆棧,收集調用跟蹤資訊。隻要有異常被抛出,Java虛拟機就必須調整調用堆棧,因為在處理過程中建立了一個新的對象。異常隻能用于錯誤處理,不應該用來控制程式流程。
6.盡可能使用局部變量
調用方法時傳遞的參數以及在調用中建立的臨時變量都儲存在棧中,速度較快,其他變量,如靜态變量、執行個體變量等,都在堆中建立,速度較慢。另外,棧中建立的變量,随着方法的運作結束,這些内容就會沒了,不需要額外的垃圾回收。
7.及時關閉流
Java程式設計過程中,進行資料庫連接配接、I/O流操作時務必小心,在使用完畢後,及時關閉以釋放資源。因為對這些大對象的操作會造成系統大的開銷,稍有不慎,将會導緻嚴重的後果。而釋放資源最好的地方就是finally代碼塊。
8.基于效率和類型檢查的考慮,應該盡可能使用array,無法确定數組大小時才使用ArrayList。
盡量使用HashMap、ArrayList、StringBuilder,除非線程安全需要,否則不推薦使用Hashtable、Vector、StringBuffer,後三者由于使用同步機制而導緻了性能開銷。