diff --git a/src/compiler.cc b/src/compiler.cc index 8fac53e9703..992ed4e82dc 100644 --- a/src/compiler.cc +++ b/src/compiler.cc @@ -23,6 +23,7 @@ #include "src/frames-inl.h" #include "src/full-codegen/full-codegen.h" #include "src/globals.h" +#include "src/heap/heap.h" #include "src/interpreter/interpreter.h" #include "src/isolate-inl.h" #include "src/log-inl.h" @@ -705,6 +706,15 @@ bool GetOptimizedCodeLater(CompilationJob* job) { return false; } + if (isolate->heap()->HighMemoryPressure()) { + if (FLAG_trace_concurrent_recompilation) { + PrintF(" ** High memory pressure, will retry optimizing "); + info->closure()->ShortPrint(); + PrintF(" later.\n"); + } + return false; + } + // All handles below this point will be allocated in a deferred handle scope // that is detached and handed off to the background thread when we return. CompilationHandleScope handle_scope(info); diff --git a/src/heap/heap.cc b/src/heap/heap.cc index 57be4fa023c..60875dd9fa8 100644 --- a/src/heap/heap.cc +++ b/src/heap/heap.cc @@ -4373,6 +4373,13 @@ class MemoryPressureInterruptTask : public CancelableTask { }; void Heap::CheckMemoryPressure() { + if (HighMemoryPressure()) { + if (isolate()->concurrent_recompilation_enabled()) { + // The optimizing compiler may be unnecessarily holding on to memory. + DisallowHeapAllocation no_recursive_gc; + isolate()->optimizing_compile_dispatcher()->Flush(); + } + } if (memory_pressure_level_.Value() == MemoryPressureLevel::kCritical) { CollectGarbageOnMemoryPressure("memory pressure"); } else if (memory_pressure_level_.Value() == MemoryPressureLevel::kModerate) {