簡體   English   中英

G1 GC中的內存分配

[英]Memory allocation in G1 GC

據我所知,當使用G1時,GC會被分割成一組大小相等的堆區域。
JVM如何在區域中分配新對象? 選擇哪個區域進行分配?

我想多個Edens的原因是它們是線程本地的。 像這樣的東西很可能也被其他收藏家使用,因為分配需要很快並且處理共享變量很慢並且規模很大。 當這樣的Eden耗盡時,需要一些同步才能獲得一大塊VM。

IIUIC G1在選擇要收集的區域方面有所不同,而不是如何分配區域。

來自Oracle Docs

在此輸入圖像描述

堆被分區為一組大小相等的堆區域,每個區域都是一個連續的虛擬內存區域。 某些區域集具有與舊收集器中相同的角色(eden,survivor,old),但它們沒有固定的大小。 這為內存使用提供了更大的靈活性。

還要檢查Garbage First Garbage Collector Tuning

以下是原始垃圾收集研究論文關於分配的內容:

堆區域中的分配包括在分配和未分配空間之間遞增邊界頂部 一個區域是分配存儲的當前分配區域 由於我們主要關注多處理器,因此mutator線程使用比較和交換或CAS操作直接在此堆區域中分配線程局部分配緩沖區TLAB 然后,他們在這些緩沖區中私下分配對象,以最大限度地減少分配爭用。 當填充當前分配區域時,選擇新的分配區域。 空區域被組織成鏈表以使區域分配成為恆定時間操作。

一般來說,你需要意識到G1仍然 世代垃圾收集器 因此,這意味着對象分配發生在通常情況下的Young Generation(Eden空間)中。 從這個角度來看,G1沒有什么新東西。 G1和例如CMS之間的區別在於Young Gen被分成幾個大小相等的區域。

Eden區域在世界停留時收集的,並且對象被壓縮到To空間中 ,因此將這些對象分配到不同的Eden區域並不是真正的問題。

堆積如山的對象分配發生在堆積如山的地區-這是分配一個大對象的特殊情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM