Java代码优化思路(JVM的角度)
優化,不僅僅是在運行環境進行優化,還需要在代碼本身做優化,如果代碼本身存在性能問題,那么在其他方面再怎么優化也不可能達到效果最優的。
盡可能使用局部變量
調用方法時傳遞的參數以及在調用中創建的臨時變量都保存在棧中速度較快,其他變量如靜態變量、實例變量(成員變量)等,都在堆中創建,速度較慢。另外,棧中創建的變量,隨著方法的運行結束,這些內容就沒了,不需要額外的垃圾回收。
盡量減少對變量的重復計算
盡量采用懶加載的策略(即在需要的時候才創建)
異常不應該用來控制程序流程
異常對性能不利。拋出異常首先要創建一個新的對象,Throwable接口的構造函數調用名為fillnStackTrace()的本地同步方法,fillnStackTrace()方法檢查堆棧,收集調用跟蹤信息。只要有異常拋出,Java虛擬機就必須調整調用堆棧,因為在處理過程中創建了一個新的對象。異常只能用于錯誤處理,不應該用來控制程序流程。
也就是不要使用類似下面的異常判斷:
if(異常==A){...}if(異常==B){...}if(異常==C){...}不要將數組聲明成public static final
因為這毫無意義,這樣只是定義了引用為static final,數組的內容還是可以隨意改變的,將數組聲明為public更是一個安全漏洞,這意味著這個數組可以被外部類所改變。
不要創建一些不使用的對象以及導入一些不使用的類
這毫無意義,如果代碼中出現:
The value of the local variable i is not used
The import java.util is never used
那么請刪除這些無用的內容。
程序運行過程中避免使用反射
反射是Java提供給用戶的一個很強大的功能,功能強大往往意味著效率不高。不建議在程序運行過程中使用尤其是頻繁使用反射機制,特別是Method的invoke方法。
如果確實有必要,一種建議性的做法是將那些需要通過反射加載的類在項目啟動的時候通過反射實例化出一個對象并放入內存。
使用數據庫連接池和線程池
這兩個池都是用于重用對象的,前者可以避免頻繁地打開和關閉連接,后者可以避免頻繁地創建和銷毀線程。
容器初始化時盡可能指定長度
容器初始化時盡可能指定長度,如:
new ArrayList<>(10); new HashMap<>(32);避免容器長度不足時,擴容帶來的性能損耗。
List集合的選擇
①ArrayList由于底層是數組實現,所以隨機遍歷快;
②LinkedList由于底層是鏈表實現,所以添加刪除快。
使用Entry遍歷Map
map.keySet()這種方式會遍歷兩次,上面的map.entrySet()方式只需遍歷一次。
不要手動調用System.gc()
手動調用GC會影響JVM對GC處理的判斷,在生產環境中要添加禁用手動調用GC的參數。
String盡量少用正則表達式
正則表達式雖然功能強大,但是效率較低,除非是有需要,否則盡量少用。
replace()不支持正則
replaceAll()不支持正則
如果僅僅是字符的替換建議使用replace()
要注意日志的輸出級別
對資源的close()建議分開操作
總結
以上是生活随笔為你收集整理的Java代码优化思路(JVM的角度)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JVM 调优实战--JVM字节码
- 下一篇: JVM 调优实战--常用命令参数及PS收