減少分配率
這個幾乎不用解釋,減少了記憶體的使用量,自然就減少 GC 回收時的壓力,同時降低了記憶體碎片與 CPU 的使用量,在設計物件時,應仔細檢查并問自己:
- 我真的需要這個物件嗎?
- 這個欄位是我需要的嗎?
- 我能減少陣列的尺寸嗎?
- 這些物件,是否只有在極少數情況下,或者只有初始化的時候才用到?
- 我是否分配了大量記憶體,但實際只使用其中很小的一部分?
- 我可以從其它地方拿到相關資料?
縮短物件的生命周期
對于垃圾回收的高性能編程有一個基本規則,事實上也是代碼設計的指導規則,
要收集的物件要么在新生代,要么不存在,
Collect objects in gen 0 or not at all.
盡量讓一個物件擁有極短的生命周期,在 Minor GC 的時候就能立即被回收了;或者就應該讓物件快速晉升到老年代,永遠保持對長生命周期物件的參考,通常,這也意味著物件可重復使用,尤其在大物件堆中的物件,
一個物件的作用范圍越短,在下一個 GC 出現時,它被晉升到老年代的機會就越小,
因此,要確保物件盡可能早的退出作用域,對于區域變數,可以在最后一次使用后,甚至在方法結束前將其生命周期結束,你可一個用 {} 將代碼包括起來,這不會對你的運行產生影響,但編譯器會認為在這個范圍的物件已經完成了它的生命周期,不再被使用了,如果需要呼叫物件的方法,盡量減少第一次和最后一次的時間間隔,以便 GC 盡早的回收物件,
如果物件關聯(參考)了一些會長時間保持的物件,則需要解除它們的參考關系,你可能會因此有更多的空值檢查(null判斷),這可能會讓代碼變得更復雜,
降低物件層次的深度/減少物件之間的參考
JVM 是通過 可達性分析演算法 來判斷物件是否存活的,如果物件的層次很深,或者大量的參考了其他物件,JVM 在判斷存活的時候就會花很多時間在遍歷物件上,這是 GC 造成長時間的一個原因,
另外一個問題是,如果無法輕松的確定物件有多少參考關系,那么就無法準確的預測物件的生命周期,減少這種復雜度是相當有必要的,它不但可以讓代碼更健壯,同時也方便除錯以及獲得更好的性能,
另外,還要注意不同代物件之間的參考也會導致 GC 的效率低下,特別是舊物件對新物件的參考,例如,如果老年代物件在新生代物件里有參考關系,那么每次發生新生代的 GC 時,也需要掃描部分老年代物件,看看他們是否仍然保持到新生代物件的參考上,雖然這不是一次完整的 GC,但它仍然是不要的作業,應該盡量避免這種情況,
避免大物件
JVM 對于大物件的處理邏輯是直接在老年代進行分配,這樣做的目的是避免在 Eden 區和及兩個 Survivor 區之間發生大量的記憶體復制,
一般我們代碼中常見的大物件是指那種很長的字串以及陣列,寫程式的時候應當避免,經常出現大物件容易導致記憶體還有不少空間時就提前觸發垃圾收集以獲取足夠的記憶體空間來“安置”它們,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/201087.html
標籤:其他
上一篇:C/C++學習日記:C語言的隨機發牌小程式(紅桃、黑桃、梅花、方塊)
下一篇:詳細的Shiro快速開始學習筆記
