1. 程式人生 > >GC——分代

GC——分代

session uil image 內存 個人 info 發生 .com 引用

新生代GC(Minor GC):發生在新生代的GC,這類對象生命周期短暫,GC頻繁,速度快。
老年代GC(Full GC):發生在老年代的GC,頻率低,速度較慢。
大多數情況下,對象在新生代分配,空間不夠時會進行一次Minor GC,生命周期長的對象會轉移到老年代。
大對象(需要大量連續內存空間的對象)在老年代分配。

分代的目的(個人愚見):GC會自動進行內存回收,但是前提是GC認為這個對象可以回收了:沒有對它的引用。GC要獲得這個前提,就得進行判斷(根搜索算法等)。生命周期長的對象,在短時間內肯定存在引用的,頻率可以放低,生命周期短的GC頻率高點。

對象創建技巧:盡可能縮短對象的生命周期,即對象的作用域盡可能小。因為對象在作用域範圍內是不會被GC的,那麽當對象多了之後,可能需要進行Minor GC或者把生命周期長的對象轉移到老年代。而老年代的對象的GC是很慢的。不利於內存回收:)

舉個栗子:
比如:MyBatis中,SqlSessionFactoryBuilder對象的作用就是創建一個SqlSessionFactory,而對於一個數據庫而言SqlSessionFactory只需要一個。這樣一來,SqlSessionFactoryBuilder對象在創建完SqlSessionFactory後就沒用了,所以把SqlSessionFactoryBuilder的創建放在局部進行。而每次訪問數據庫,SqlSessionFactory都要創建一個SqlSession,所以SqlSessionFactory可以是單例對象(飽漢式/餓漢式的優缺點再說)且隨服務器啟動、關閉而生死。

技術分享圖片

GC——分代