Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java G1算法中的记忆集用于什么?_Java_Jvm_G1gc - Fatal编程技术网

Java G1算法中的记忆集用于什么?

Java G1算法中的记忆集用于什么?,java,jvm,g1gc,Java,Jvm,G1gc,我刚刚读了一些关于G1算法的博客 我对记忆集的用法感到困惑 以下是我的想法: 既然我们可以使用DFS遍历来自GC根的每个引用,为什么我们需要记忆集 让所有的博客都说我们使用记忆集的原因是我们不需要检查每个区域,看看是否有GC根引用的对象。依我看,你需要先了解什么是卡表。如何只扫描年轻一代区域并清理它,是否有来自老一代的引用返回到年轻?您需要准确地“跟踪”这些连接存在的位置-因此,在扫描年轻一代时,您可以在不破坏堆的情况下清理它 想想看:如果有一个B的引用,你不能将一个对象A标记为现在是年轻一代的

我刚刚读了一些关于G1算法的博客

我对记忆集的用法感到困惑

以下是我的想法:

既然我们可以使用DFS遍历来自GC根的每个引用,为什么我们需要记忆集


让所有的博客都说我们使用记忆集的原因是我们不需要检查每个区域,看看是否有GC根引用的对象。依我看,你需要先了解什么是
卡表
。如何只扫描
年轻一代
区域并清理它,是否有来自
老一代
的引用返回到
年轻
?您需要准确地“跟踪”这些连接存在的位置-因此,在扫描
年轻一代时,您可以在不破坏堆的情况下清理它

想想看:如果有一个
B
的引用,你不能将一个对象
A
标记为现在是年轻一代的对象,从
老一代的
中删除它。但请记住,现在,你只是在年轻的收集。因此,为了跟踪这些“连接”,实现了
卡表
。这个卡片表中的每一位都表示老一代的某一部分是“脏的”,这意味着在扫描年轻一代的同时也扫描老一代的那一部分

你为什么需要这个?扫描young的全部目的是扫描堆的一小部分,而不是全部。这个
卡表
实现了这一点

G1
具有区域。如果您正在扫描
区域A
,看到它有指向其他
区域B
的指针,该怎么办?仅将此信息放在
卡表中是不够的。您的卡表将只知道
regionA
,下次扫描
regionB
-您如何知道您也应该扫描
regionA
?如果不这样做,堆完整性显然会被破坏

因此:
记忆集
。这些集合由异步线程填充:它扫描
卡表
,并根据该信息扫描这些“脏”区域的指针指向的位置。它跟踪
regionA->regionB
连接。每个区域都有自己的
记忆集

因此,当您到达需要进行GC的点时,在扫描
区域B
时,您还可以查看它的
记忆集
,并发现您还需要扫描
区域A


实际上,这就是为什么
G1
成为一代人的原因:这些
记忆集原来是巨大的。如果在
young
old
中划分堆,则无需保留年轻一代之间的连接,您可以一次扫描所有这些连接,从而消除这些集的大小
G1
希望保持
200ms
(默认)的承诺-要做到这一点,您需要一次扫描所有年轻的一代(因为
记忆集的区域之间没有连接,否则堆完整性就会消失),但与此同时,如果你让年轻一代变小,
记忆集的大小将变大


因此,触摸这些设置是一个工程奇迹,IMHO。

“因为在分代GC中,我们可能需要在年轻一代中找到所有活动对象,而不需要遍历老一代…”这是否意味着每次g1想要回收一个区域时,它都需要检查他的记忆集和记忆集的记忆集中的每个指针,如果以gc根结尾,这意味着它不是recyclable@Michael你是对的,但是记忆中的集合是在G1成为世代之前“诞生”的,事实上,这些集合的大小触发了G1成为世代。@ratsafalig你有它向后的。引用不会遍历到GC根。参照指向另一个方向,因此,只能从根到对象遍历参照。否则,垃圾收集就不会是一个如此昂贵的操作。我可以这样想:
记忆集
卡片表
更精确的版本,因为
卡片表
只知道哪个区域,而
记忆集
知道确切的位置address@ratsafalig坦率地说,不是。这些不是“版本”G1两者都有