[vm, gc] Incremental compaction.
At the beginning of a major GC cycle, select some mostly-empty pages to be evacuated. Mark the pages and the objects on these pages. Apply a write barrier for stores creating old -> evacuation candidate pointers, and discover any such pointers that already exist during marking. At the end of a major GC cycle, evacuate objects from these pages. Forward pointers of objects in the remembered set and new-space. Free the evacuated pages. This compaction is incremental in the sense that creating the remembered set is interleaved with mutator execution. The evacuation step, however, is stop-the-world. Write-barrier elimination for x.slot = x is removed. Write-barrier elimination for x.slot = constant is removed in the JIT, kept for AOT but snapshot pages are marked as never-evacuate. TEST=ci Bug: https://github.com/dart-lang/sdk/issues/52513 Change-Id: Icbc29ef7cb662ef8759b8c1d7a63b7af60766281 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/357760 Reviewed-by: Alexander Aprelev <aam@google.com> Commit-Queue: Ryan Macnak <rmacnak@google.com>
This commit is contained in:
committed by
Commit Queue
parent
45221e51c3
commit
bc0f02e4c8
@@ -48,16 +48,12 @@ void UntaggedObject::Validate(IsolateGroup* isolate_group) const {
|
||||
// Validate that the tags_ field is sensible.
|
||||
uword tags = tags_;
|
||||
if (IsNewObject()) {
|
||||
if (!NewBit::decode(tags)) {
|
||||
if (!NewOrEvacuationCandidateBit::decode(tags)) {
|
||||
FATAL("New object missing kNewBit: %" Px "\n", tags);
|
||||
}
|
||||
if (OldAndNotRememberedBit::decode(tags)) {
|
||||
FATAL("New object has kOldAndNotRememberedBit: %" Px "\n", tags);
|
||||
}
|
||||
} else {
|
||||
if (NewBit::decode(tags)) {
|
||||
FATAL("Old object has kNewBit: %" Px "\n", tags);
|
||||
}
|
||||
}
|
||||
const intptr_t class_id = ClassIdTag::decode(tags);
|
||||
if (!isolate_group->class_table()->IsValidIndex(class_id)) {
|
||||
|
||||
Reference in New Issue
Block a user