last_idle_notification_time_(0.0),
last_gc_time_(0.0),
scavenge_collector_(nullptr),
- mark_compact_collector_(this),
+ mark_compact_collector_(nullptr),
store_buffer_(this),
incremental_marking_(this),
gc_idle_time_handler_(nullptr),
incremental_marking()->Step(kStepSizeWhenDelayedByScavenge,
IncrementalMarking::NO_GC_VIA_STACK_GUARD);
if (!incremental_marking()->IsComplete() &&
- !mark_compact_collector_.marking_deque_.IsEmpty() && !FLAG_gc_global) {
+ !mark_compact_collector()->marking_deque_.IsEmpty() &&
+ !FLAG_gc_global) {
if (FLAG_trace_incremental_marking) {
PrintF("[IncrementalMarking] Delaying MarkSweep.\n");
}
// We finished a marking cycle. We can uncommit the marking deque until
// we start marking again.
- mark_compact_collector_.marking_deque()->Uninitialize();
- mark_compact_collector_.EnsureMarkingDequeIsCommitted(
+ mark_compact_collector()->marking_deque()->Uninitialize();
+ mark_compact_collector()->EnsureMarkingDequeIsCommitted(
MarkCompactCollector::kMinMarkingDequeSize);
}
uint64_t size_of_objects_before_gc = SizeOfObjects();
- mark_compact_collector_.Prepare();
+ mark_compact_collector()->Prepare();
ms_count_++;
MarkCompactPrologue();
- mark_compact_collector_.CollectGarbage();
+ mark_compact_collector()->CollectGarbage();
LOG(isolate_, ResourceEvent("markcompact", "end"));
if (FLAG_overapproximate_weak_closure && incremental_marking()->IsMarking() &&
(incremental_marking()->IsReadyToOverApproximateWeakClosure() ||
(!incremental_marking()->weak_closure_was_overapproximated() &&
- mark_compact_collector_.marking_deque()->IsEmpty()))) {
+ mark_compact_collector()->marking_deque()->IsEmpty()))) {
OverApproximateWeakClosure(comment);
} else if (incremental_marking()->IsComplete() ||
- (mark_compact_collector_.marking_deque()->IsEmpty())) {
+ (mark_compact_collector()->marking_deque()->IsEmpty())) {
CollectAllGarbage(current_gc_flags_, comment);
}
}
if (FLAG_overapproximate_weak_closure &&
(incremental_marking()->IsReadyToOverApproximateWeakClosure() ||
(!incremental_marking()->weak_closure_was_overapproximated() &&
- mark_compact_collector_.marking_deque()->IsEmpty() &&
+ mark_compact_collector()->marking_deque()->IsEmpty() &&
gc_idle_time_handler_->ShouldDoOverApproximateWeakClosure(
static_cast<size_t>(idle_time_in_ms))))) {
OverApproximateWeakClosure(
"Idle notification: overapproximate weak closure");
return true;
} else if (incremental_marking()->IsComplete() ||
- (mark_compact_collector_.marking_deque()->IsEmpty() &&
+ (mark_compact_collector()->marking_deque()->IsEmpty() &&
gc_idle_time_handler_->ShouldDoFinalIncrementalMarkCompact(
static_cast<size_t>(idle_time_in_ms), size_of_objects,
final_incremental_mark_compact_speed_in_bytes_per_ms))) {
} while (remaining_time_in_ms >=
2.0 * GCIdleTimeHandler::kIncrementalMarkingStepTimeInMs &&
!incremental_marking()->IsComplete() &&
- !mark_compact_collector_.marking_deque()->IsEmpty());
+ !mark_compact_collector()->marking_deque()->IsEmpty());
return remaining_time_in_ms;
}
lo_space_->Verify();
- mark_compact_collector_.VerifyWeakEmbeddedObjectsInCode();
+ mark_compact_collector()->VerifyWeakEmbeddedObjectsInCode();
if (FLAG_omit_map_checks_for_leaf_maps) {
- mark_compact_collector_.VerifyOmittedMapChecks();
+ mark_compact_collector()->VerifyOmittedMapChecks();
}
}
#endif
scavenge_collector_ = new Scavenger(this);
+ mark_compact_collector_ = new MarkCompactCollector(this);
+
gc_idle_time_handler_ = new GCIdleTimeHandler();
memory_reducer_ = new MemoryReducer(this);
delete scavenge_collector_;
scavenge_collector_ = nullptr;
+ if (mark_compact_collector_ != nullptr) {
+ mark_compact_collector_->TearDown();
+ delete mark_compact_collector_;
+ mark_compact_collector_ = nullptr;
+ }
+
delete gc_idle_time_handler_;
gc_idle_time_handler_ = nullptr;
external_string_table_.TearDown();
- mark_compact_collector()->TearDown();
-
delete tracer_;
tracer_ = nullptr;
#include <cmath>
#include <map>
+// Clients of this interface shouldn't depend on lots of heap internals.
+// Do not include anything from src/heap here!
#include "src/allocation.h"
#include "src/assert-scope.h"
#include "src/atomic-utils.h"
#include "src/globals.h"
+// TODO(mstarzinger): Three more includes to kill!
#include "src/heap/incremental-marking.h"
-#include "src/heap/mark-compact.h"
#include "src/heap/spaces.h"
#include "src/heap/store-buffer.h"
#include "src/list.h"
inline Isolate* isolate();
MarkCompactCollector* mark_compact_collector() {
- return &mark_compact_collector_;
+ return mark_compact_collector_;
}
// ===========================================================================
Scavenger* scavenge_collector_;
- MarkCompactCollector mark_compact_collector_;
+ MarkCompactCollector* mark_compact_collector_;
StoreBuffer store_buffer_;
#include "src/cancelable-task.h"
#include "src/execution.h"
#include "src/heap/incremental-marking-job.h"
-#include "src/heap/mark-compact.h"
#include "src/objects.h"
namespace v8 {
namespace internal {
+// Forward declarations.
+class MarkBit;
+class PagedSpace;
+
class IncrementalMarking {
public:
enum State { STOPPED, SWEEPING, MARKING, COMPLETE };
SetOldSpacePageFlags(chunk, IsMarking(), IsCompacting());
}
- inline void SetNewSpacePageFlags(NewSpacePage* chunk) {
+ inline void SetNewSpacePageFlags(MemoryChunk* chunk) {
SetNewSpacePageFlags(chunk, IsMarking());
}
static void SetOldSpacePageFlags(MemoryChunk* chunk, bool is_marking,
bool is_compacting);
- static void SetNewSpacePageFlags(NewSpacePage* chunk, bool is_marking);
+ static void SetNewSpacePageFlags(MemoryChunk* chunk, bool is_marking);
INLINE(void ProcessMarkingDeque());