| Index: src/heap/mark-compact.cc
|
| diff --git a/src/heap/mark-compact.cc b/src/heap/mark-compact.cc
|
| index e366a8f4e3b3b5e5c049b4b348063f7f2e8f8897..a4c1971c13f33355ec5468dccadda52e130d53c0 100644
|
| --- a/src/heap/mark-compact.cc
|
| +++ b/src/heap/mark-compact.cc
|
| @@ -325,7 +325,6 @@ void MarkCompactCollector::ClearInvalidRememberedSetSlots() {
|
| #endif
|
| }
|
|
|
| -
|
| void MarkCompactCollector::CollectGarbage() {
|
| // Make sure that Prepare() has been called. The individual steps below will
|
| // update the state as they proceed.
|
| @@ -1263,10 +1262,6 @@ void MarkCompactMarkingVisitor::Initialize() {
|
| StaticMarkingVisitor<MarkCompactMarkingVisitor>::Initialize();
|
|
|
| table_.Register(kVisitJSRegExp, &VisitRegExpAndFlushCode);
|
| -
|
| - if (FLAG_track_gc_object_stats) {
|
| - MarkCompactObjectStatsVisitor::Initialize(&table_);
|
| - }
|
| }
|
|
|
|
|
| @@ -2243,6 +2238,41 @@ void MarkCompactCollector::RegisterExternallyReferencedObject(Object** object) {
|
| MarkObject(heap_object, mark_bit);
|
| }
|
|
|
| +class MarkCompactCollector::ObjectStatsVisitor
|
| + : public MarkCompactCollector::HeapObjectVisitor {
|
| + public:
|
| + ObjectStatsVisitor(ObjectStats* live_stats, ObjectStats* dead_stats)
|
| + : live_stats_(live_stats), dead_stats_(dead_stats) {
|
| + DCHECK_NOT_NULL(live_stats_);
|
| + DCHECK_NOT_NULL(dead_stats_);
|
| + }
|
| +
|
| + bool Visit(HeapObject* obj) override {
|
| + if (Marking::IsBlack(ObjectMarking::MarkBitFrom(obj))) {
|
| + ObjectStatsCollector::CollectStatistics(live_stats_, obj);
|
| + } else {
|
| + DCHECK(!Marking::IsGrey(ObjectMarking::MarkBitFrom(obj)));
|
| + ObjectStatsCollector::CollectStatistics(dead_stats_, obj);
|
| + }
|
| + return true;
|
| + }
|
| +
|
| + private:
|
| + ObjectStats* live_stats_;
|
| + ObjectStats* dead_stats_;
|
| +};
|
| +
|
| +void MarkCompactCollector::VisitAllObjects(HeapObjectVisitor* visitor) {
|
| + SpaceIterator space_it(heap());
|
| + HeapObject* obj = nullptr;
|
| + while (space_it.has_next()) {
|
| + ObjectIterator* it = space_it.next();
|
| + while ((obj = it->Next()) != nullptr) {
|
| + visitor->Visit(obj);
|
| + }
|
| + }
|
| +}
|
| +
|
| void MarkCompactCollector::MarkLiveObjects() {
|
| TRACE_GC(heap()->tracer(), GCTracer::Scope::MC_MARK);
|
| double start_time = 0.0;
|
| @@ -2262,10 +2292,6 @@ void MarkCompactCollector::MarkLiveObjects() {
|
| } else {
|
| // Abort any pending incremental activities e.g. incremental sweeping.
|
| incremental_marking->Stop();
|
| - if (FLAG_track_gc_object_stats) {
|
| - // Clear object stats collected during incremental marking.
|
| - heap()->object_stats_->ClearObjectStats();
|
| - }
|
| if (marking_deque_.in_use()) {
|
| marking_deque_.Uninitialize(true);
|
| }
|
| @@ -2347,10 +2373,15 @@ void MarkCompactCollector::MarkLiveObjects() {
|
| start_time);
|
| }
|
| if (FLAG_track_gc_object_stats) {
|
| + ObjectStatsVisitor visitor(heap()->live_object_stats_,
|
| + heap()->dead_object_stats_);
|
| + VisitAllObjects(&visitor);
|
| if (FLAG_trace_gc_object_stats) {
|
| - heap()->object_stats_->TraceObjectStats();
|
| + heap()->live_object_stats_->PrintJSON("live");
|
| + heap()->dead_object_stats_->PrintJSON("dead");
|
| }
|
| - heap()->object_stats_->CheckpointObjectStats();
|
| + heap()->live_object_stats_->CheckpointObjectStats();
|
| + heap()->dead_object_stats_->ClearObjectStats();
|
| }
|
| }
|
|
|
|
|