在虛擬機器中,我們知道物件的記憶體是分配在堆中的。但是堆又可以劃分為更小的區域以便垃圾**,那麼,物件到底是怎麼在分配在堆中的呢?
大多數情況下,物件都在新生代的eden區中分配記憶體。而因為大部分的物件都是「朝生夕死」的,所以新生代又會頻繁進行垃圾**。
需要大量連續空間的物件,如:長字串、陣列等,會直接在老年代分配記憶體。這是因為,這樣可以避免在新生代區頻繁的gc時發生大量的記憶體賦值(新生代的gc是採用複製演算法的)。
新生代中經歷了多次gc仍然存活的物件,當年齡達到一定程度(預設15)時就會晉公升到老年代。
為了更好地適應記憶體情況,虛擬機器不是要求物件必須到達閥值才可晉公升老年代的,而是採用動態年齡判定的方法:如果servivor空間中相同年齡的物件大小大於servivor空間的一般時,由於下一次的minorgc時,這些物件如果仍然存活的話,複製到toservivor空間時就放不下了。所以,在本次gc時就可以把這些物件以及年齡大於等於這些物件的直接進入老年代。
在minorgc時,如果eden和fromservivor中存活的物件在複製到toservivor時放不下了,也會直接分配到老年代。
在發生minor gc之前,虛擬機會先檢查老年代最大可用的連續空間是否大於新生代所有物件總空間,如果這個條件成立,那麼minor gc可以確保是安全的。如果不成立,則虛擬機會檢視handlepromotionfailure設定值是否允許擔保失敗。如果允許,那麼會繼續檢查老年代最大可用的連續空間是否大於歷次晉公升到老年代物件的平均大小,如果大於,將嘗試著進行一次minor gc,儘管這次minor gc是有風險的;如果小於,或者handlepromotionfailure設定不允許冒險,那這時也要改為進行一次full gc。
Memcache 記憶體分配策略
memcached預設採用了名為slab allocator的機制分配和管理記憶體。在該機制出現以前,記憶體的分配是通過對所有記錄簡單的進行malloc和free來進行了。但是這種方式會導致記憶體碎片化嚴重,加重作業系統記憶體管理器的負擔。slab allocator就是位了解決該問題而誕生的。sl...
記憶體分配策略和分配演算法
在為程序分配記憶體時,將涉及到3個問題 1 最小物理塊數的確定 2 物理塊的分配策略 3 物理塊的分配演算法。1 最小物理塊數的確定 這裡所說的最小物理塊數,是指能保證程序正常執行所需的最小物理塊數。當系統為程序分配的物理塊數小於此值時,程序將無法執行。程序應獲得的最少物理塊數與計算機的硬體結構有關...
磁碟排程演算法,記憶體排程,記憶體分配策略
磁碟是可供多個程序共享的裝置,當有多個程序都要求訪問磁碟時,應採用一種最佳排程演算法,以使各程序對磁碟的平均訪問時間最小。由於在訪問磁碟的時間中,主要是尋道時間。因此 磁碟排程演算法的目標是使磁碟的平均尋道時間最少 先來先服務 first come first served 根據程序請求訪問磁碟的先...