让你脱胎成技术大神的JAVA开发技巧
開發過程中,那些被稱為“666”的大神,領先你的,往往也只有幾個快捷鍵的距離。一些簡單的技巧和開發習慣,往往能讓你在開發過程中事半功倍。
避免重復創建對象
為什么?
更少的對象會需要更少的垃圾回收
使用的空間越少,應用的性能越好
怎么做?
重復利用一個對象,而不是在每次需要的時候都去創建一個功能一樣的對象
(這樣做)
String s = “No longer silly”;
(不要這樣)
String s = new String(“silly”);
不可變類中既提供構造函數,又提供了靜態工廠方法的,優先考慮使用靜態工廠方法。復用那些一旦初始化(使用靜態初始化)就不會改變的對象。+++
避免循環引用
為什么
一組相互引用的對象,如果他們沒有被其他對象直接引用的話,它們會變得不可達,這樣會導致它們一直都保留在內存里。
怎么做
你可以使用強引用來表示“父到子“的引用關系,使用弱引用來表示“子到父”的引用關系。
了解和學習一下 JVM 內存管理
為什么
有些人認為Java 程序員不需要知道內部 JVM 內存管理。毫無疑問,這種觀點明顯是錯誤的,如果想拓寬知識面和提升排除故障能力,你就必須要了解和學習一下 JVM 內存管理
怎么做?
JVM 內存分為 3 個內存空間
Java Heap:適用于所有的JVM廠商,通常用來拆分 YoungGen(幼苗 ) 和OldGen(終身享用)空間。
PermGen(永久代):適用于SunHotSpot VM((PermGen 空間在 Java7 或者Java8 更新中將會被刪除)
Native Heap(C-Heap):適用于所有的JVM廠商。正如你所看到的,JVM內存管理比使用 Xmx 設置最大值更為復雜。你需要查看每個角度,包括本地和PermGen 需求以及從主機上查看物理內存可用性(CPU core)。
使用==操作符來替代equals(Object)方法
為什么
==操作符的性能更好
例如,對于字符串比較,equals()方法會去比較字符串對象里的字符。==操作符會比較兩個對象的引用,來比較它們是否指向同一個實例。
怎么做:
當且僅當a==b 的時候才會有a.equals(b)
例如,對于重復調用的地方,使用靜態工廠方法來返回相同的對象。
避免使用finalizer
為什么
垃圾回收器需要單獨記錄等待終結的對象
調用finalize方法也有一定的開銷
Finalizer是不安全的,因為它有可能會復活一個對象,這樣會干擾垃圾回收。
避免使用引用對象
為什么
和finalizer一樣,垃圾回收器需要特別處理軟引用、弱引用以及幽靈引用。
盡管引用對象在某些方面很有作用,例如,簡化cache的實現,但是大量引用對象的存在會使得垃圾回收運行緩慢。
記錄一個引用對象的開銷遠遠超過一個普通對象(強引用)的開銷.
避免使用對象池
為什么
對象池不僅會使得更多的數據對象保持活動,同時會使得對象的存活時間延長.
值得注意的是,大量存活的數據對象的處理是GC的瓶頸,GC被優化成適合于處理許多壽命較短的對象
并且,創建新的對象而不是保持舊的對象存活,會對緩存的局部性有益.
不過,在一個包含大量大對象的環境下,例如大的數組,性能或許會因為使用對象池而有所提升。
選擇好的算法和數據結構
為什么
考慮一下通過鏈表來實現隊列的場景
即使你的程序不需要遍歷整個鏈表,但是垃圾回收器還是需要這樣做的。
如果元素的封裝者沒有把元素沒有把元素放在內存中鄰近的位置,這樣會破壞緩存局部性。因而會導致程序長時間的暫停,尤其是對象的指針分散在一個很大的堆區時,垃圾回收器會在標記階段追隨指針的時候頻繁遭遇緩存失效。
避免使用System.gc
為什么
Java語言規范里沒有保證調用System.gc會做什么。如果它規定了的話,或許會超出你的期望,也或許每次調用都做不同的事情。
避免使用太多的線程
為什么
進程上下文切換的次數會隨著要調度的進程的數目相應地增長,這樣會對性能有隱性的影響。
例如,IntelA-64處理器上的本地線程上下文的大小大概是幾千KB。
回顧靜態占用需求
為什么
設法對靜態內存占用進行合理的評估,在真正進行數據測試之前,設置一些 JVM 能力起點是非常有用的。
怎么做
應用程序以及相關數據將決定 Java堆空間占用需求。通過靜態內存,可預測下面的內存需求:
確定將會有多少不同的應用程序部署到預先計劃的一個單獨的 JVM 進程上,確定有多少個類需要在運行時加載:包括第三方 API。確定數據緩存占用,如應用程序加載內部緩存數據結構(和第三方 API)。 確定允許建立的中間件線程數量。
在 JVM 進程上部署的應用程序越多,對本地內存和 PermGen 空間的要求就越高。數據緩存并不是序列化為一個磁盤或數據庫,它將從 OldGen 空間里面需要額外的內存。設法對靜態內存占用進行合理的評估,在真正進行數據測試前,設置一些JVM能力起點是非常有用的。對于32 位JVM, 通常不推薦一個Java堆大小超過2GB(-Xms2048m,-Xmx2048m),對于 JavaEE應用程序和線程來說這樣將需要足夠的內存和本機堆 PermGen。這個評估是非常重要因為太多的應用程序部署在一個32 位JVM進程上很容易導致本機堆耗盡;尤其是在多重線程環境。對于64位JVM, 一個3GB或者4GB 的 Java 堆/JVM 進程是推薦的起點。
避免不需要的異常
為什么
異常處理會占用一定的事件,并且會打斷程序的正常執行流程。
作者曾經遇到這樣一場景,在客戶的應用里,一個正常的執行流程每秒會拋出成千上萬的NullPointerException。這個錯誤被糾正后,應用的性能里面有了一個數量級的提升。
避免使用大對象
為什么
大對象有時候需要直接在堆而不是在線程本地存儲區(thread local areas, TLA)進行內存分配。
大對象直接在堆上分配是有壞處的,因為它會更快地產生內存碎片。在虛擬機(例如JRockit)上分配大對象會降低性能,因為分配內存的時候會使用堆的全局鎖。
為了讓學習變得輕松、高效,今天給大家免費分享一套Java入門教學資源。幫助大家在成為Java架構師的道路上披荊斬棘。需要資料的歡迎加入學習交流群:9285,05736
總結
以上是生活随笔為你收集整理的让你脱胎成技术大神的JAVA开发技巧的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python循环结构语句_python控
- 下一篇: java面向对象多态特性