[英]Memory allocation in G1 GC
據我所知,當使用G1時,GC會被分割成一組大小相等的堆區域。
JVM如何在區域中分配新對象? 選擇哪個區域進行分配?
我想多個Edens的原因是它們是線程本地的。 像這樣的東西很可能也被其他收藏家使用,因為分配需要很快並且處理共享變量很慢並且規模很大。 當這樣的Eden耗盡時,需要一些同步才能獲得一大塊VM。
IIUIC G1在選擇要收集的區域方面有所不同,而不是如何分配區域。
來自Oracle Docs :
堆被分區為一組大小相等的堆區域,每個區域都是一個連續的虛擬內存區域。 某些區域集具有與舊收集器中相同的角色(eden,survivor,old),但它們沒有固定的大小。 這為內存使用提供了更大的靈活性。
以下是原始垃圾收集研究論文關於分配的內容:
堆區域中的分配包括在分配和未分配空間之間遞增邊界頂部 。 一個區域是分配存儲的當前分配區域 。 由於我們主要關注多處理器,因此mutator線程使用比較和交換或CAS操作直接在此堆區域中分配線程局部分配緩沖區或TLAB 。 然后,他們在這些緩沖區中私下分配對象,以最大限度地減少分配爭用。 當填充當前分配區域時,選擇新的分配區域。 空區域被組織成鏈表以使區域分配成為恆定時間操作。
一般來說,你需要意識到G1仍然是 世代垃圾收集器 。 因此,這意味着對象分配發生在通常情況下的Young Generation(Eden空間)中。 從這個角度來看,G1沒有什么新東西。 G1和例如CMS之間的區別在於Young Gen被分成幾個大小相等的區域。
Eden區域是在世界停留時收集的,並且對象被壓縮到To空間中 ,因此將這些對象分配到不同的Eden區域並不是真正的問題。
堆積如山的對象分配發生在堆積如山的地區-這是分配一個大對象的特殊情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.