diff --git a/_posts/2024-08-25-g1-gc-young-gc-root-scan.md b/_posts/2024-08-25-g1-gc-young-gc-root-scan.md index 5cf8040..c149c9b 100644 --- a/_posts/2024-08-25-g1-gc-young-gc-root-scan.md +++ b/_posts/2024-08-25-g1-gc-young-gc-root-scan.md @@ -34,6 +34,8 @@ virtual void work(uint worker_id) { } ``` + + 这里主要逻辑都在 `G1MergeCardSetClosure` 里面,它主要做了三件事情。 1. 遍历记忆集,将记忆集中的 region 的 card 对应的 card table 位置标记为 dirty,即将记忆集存储的转换成 card table 存储。 @@ -41,7 +43,7 @@ virtual void work(uint worker_id) { 后续 heap root scan 阶段需要依赖上面两类的信息。 -3. 将会收集中的 reigon 统一添加到 ` _scan_state._all_dirty_regions`,由于这部分 region 被回收了,那么其对应的 card table 位置需要被清理。 +3. 将回收集中的 reigon 统一添加到 ` _scan_state._all_dirty_regions`,由于这部分 region 被回收了,那么其对应的 card table 位置需要被清理。 ### G1MergeCardSetClosure @@ -159,6 +161,7 @@ class G1MergeCardSetClosure : public G1HeapRegionClosure { 对每个 dirty card 进行处理,`_merge_card_set_cache` 用于优化性能,`mark_clean_as_dirty` 将存在跨 region 引用的 card 标记为 dirty card。 + ```cpp //->ptr.iterate(cl, _config->inline_ptr_bits_per_card()); //->found(value & card_mask); @@ -175,11 +178,17 @@ class G1MergeCardSetClosure : public G1HeapRegionClosure { } void mark_card(G1CardTable::CardValue* value) { - if (_ct->mark_clean_as_dirty(value)) { } + if (_ct->mark_clean_as_dirty(value)) { + _scan_state->set_chunk_dirty(_ct->index_for_cardvalue(value)); + } } } ``` +`scan_state->set_chunk_dirty`对 card index 进行压缩,64 个 card组成一个 chunk。相当于对 dirty card 分层,添加了一层索引,后续可以看到对 + + + ## scan root scan root 的代码如下,核心逻辑封装在 `scan_roots` 中: @@ -632,7 +641,9 @@ class G1CardTableChunkClaimer { } ``` -`_region_scan_chunks` 在遍历记忆集的时候初始化, 用于加快查找。 + + +`_region_scan_chunks` 在遍历记忆集的时候初始化后, 用于加快查找。 ```cpp void set_chunk_range_dirty(size_t const region_card_idx, size_t const card_length) { diff --git a/assets/gc-young-gc-root-scan/g1-gc-ygc-rset-scan.png b/assets/gc-young-gc-root-scan/g1-gc-ygc-rset-scan.png new file mode 100644 index 0000000..871df84 Binary files /dev/null and b/assets/gc-young-gc-root-scan/g1-gc-ygc-rset-scan.png differ diff --git a/assets/gc-young-gc-root-scan/g1-gc-young-gc-root-scan-chunk.png b/assets/gc-young-gc-root-scan/g1-gc-young-gc-root-scan-chunk.png new file mode 100644 index 0000000..e147539 Binary files /dev/null and b/assets/gc-young-gc-root-scan/g1-gc-young-gc-root-scan-chunk.png differ