}
-void Heap::FinalizeIncrementalMarkingIfComplete(const char* comment) {
- if (FLAG_overapproximate_weak_closure &&
- (incremental_marking()->IsReadyToOverApproximateWeakClosure() ||
- (!incremental_marking()->weak_closure_was_overapproximated() &&
- mark_compact_collector_.marking_deque()->IsEmpty()))) {
- OverApproximateWeakClosure(comment);
- } else if (incremental_marking()->IsComplete() ||
- (mark_compact_collector_.marking_deque()->IsEmpty())) {
- CollectAllGarbage(current_gc_flags(), comment);
- }
-}
-
-
bool Heap::TryFinalizeIdleIncrementalMarking(
double idle_time_in_ms, size_t size_of_objects,
size_t final_incremental_mark_compact_speed_in_bytes_per_ms) {
// Notify the heap that a context has been disposed.
int NotifyContextDisposed(bool dependant_context);
- void FinalizeIncrementalMarkingIfComplete(const char* comment);
-
inline void increment_scan_on_scavenge_pages() {
scan_on_scavenge_pages_++;
if (FLAG_gc_verbose) {
bool HasHighFragmentation();
bool HasHighFragmentation(intptr_t used, intptr_t committed);
- bool ShouldOptimizeForMemoryUsage() { return optimize_for_memory_usage_; }
-
// ===========================================================================
// Initialization. ===========================================================
// ===========================================================================
if (state_.action == kRun) {
DCHECK(heap()->incremental_marking()->IsStopped());
DCHECK(FLAG_incremental_marking);
+ heap()->StartIdleIncrementalMarking();
if (FLAG_trace_gc_verbose) {
PrintIsolate(heap()->isolate(), "Memory reducer: started GC #%d\n",
state_.started_gcs);
}
- if (heap()->ShouldOptimizeForMemoryUsage()) {
- // Do full GC if memory usage has higher priority than latency. This is
- // important for background tabs that do not send idle notifications.
- heap()->CollectAllGarbage(Heap::kReduceMemoryFootprintMask,
- "memory reducer");
- } else {
- heap()->StartIdleIncrementalMarking();
- }
} else if (state_.action == kWait) {
- if (!heap()->incremental_marking()->IsStopped() &&
- heap()->ShouldOptimizeForMemoryUsage()) {
- // Make progress with pending incremental marking if memory usage has
- // higher priority than latency. This is important for background tabs
- // that do not send idle notifications.
- const int kIncrementalMarkingDelayMs = 500;
- double deadline = heap()->MonotonicallyIncreasingTimeInMs() +
- kIncrementalMarkingDelayMs;
- heap()->AdvanceIncrementalMarking(
- 0, deadline, i::IncrementalMarking::StepActions(
- i::IncrementalMarking::NO_GC_VIA_STACK_GUARD,
- i::IncrementalMarking::FORCE_MARKING,
- i::IncrementalMarking::FORCE_COMPLETION));
- heap()->FinalizeIncrementalMarkingIfComplete(
- "Memory reducer: finalize incremental marking");
- }
// Re-schedule the timer.
ScheduleTimer(state_.next_gc_start_ms - event.time_ms);
if (FLAG_trace_gc_verbose) {