Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(318)

Unified Diff: src/heap/heap.cc

Issue 1988623002: Ensure black and gray objects are kept around by scavenger (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fix for black pages Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/heap/heap.cc
diff --git a/src/heap/heap.cc b/src/heap/heap.cc
index ef00aa07f0232732b4445522235de4854fc2d59a..0648b02ea0bd5b5eaa14bde177a6770586470a30 100644
--- a/src/heap/heap.cc
+++ b/src/heap/heap.cc
@@ -1695,6 +1695,16 @@ void Heap::Scavenge() {
new_space_front = DoScavenge(&scavenge_visitor, new_space_front);
}
+ {
+ // Copy objects marked black or grey by MarkCompact collector.
Hannes Payer (out of office) 2016/05/20 07:34:41 Scavenge objects...
Marcel Hlopko 2016/05/20 14:31:41 Done.
+ TRACE_GC(tracer(),
+ GCTracer::Scope::SCAVENGER_OBJECTS_MARKED_BY_MARK_COMPACT);
+ if (incremental_marking()->IsMarking()) {
+ IterateMarkedForScavenger(&scavenge_visitor);
+ new_space_front = DoScavenge(&scavenge_visitor, new_space_front);
+ }
+ }
+
if (FLAG_scavenge_reclaim_unmodified_objects) {
isolate()->global_handles()->MarkNewSpaceWeakUnmodifiedObjectsPending(
&IsUnscavengedHeapObject);
@@ -3052,6 +3062,7 @@ void Heap::CreateFillerObjectAt(Address addr, int size,
if (mode == ClearRecordedSlots::kYes) {
ClearRecordedSlotRange(addr, addr + size);
}
+
// At this point, we may be deserializing the heap from a snapshot, and
// none of the maps have been created yet and are NULL.
DCHECK((filler->map() == NULL && !deserialization_complete_) ||
@@ -4840,6 +4851,20 @@ void Heap::IterateStrongRoots(ObjectVisitor* v, VisitMode mode) {
// checking of the sync flag in the snapshot would fail.
}
+void Heap::IterateMarkedForScavenger(ObjectVisitor* visitor) {
+ NewSpacePageIterator it(new_space_.from_space());
+ while (it.has_next()) {
+ Page* page = it.next();
+ LiveObjectIterator<kAllLiveObjects> it(page);
+ Object* object = nullptr;
+ while ((object = it.Next()) != nullptr) {
+ if (object->IsHeapObject()) {
+ DCHECK(IsUnscavengedHeapObject(this, &object));
+ visitor->VisitPointer(&object);
+ }
+ }
+ }
+}
// TODO(1236194): Since the heap size is configurable on the command line
// and through the API, we should gracefully handle the case that the heap

Powered by Google App Engine
This is Rietveld 408576698