Flush the optimizing compilejob queue when doing memory pressure GCs

R=ulan@chromium.org,hpayer@chromium.org
BUG=

Review-Url: https://codereview.chromium.org/2145683003
Cr-Commit-Position: refs/heads/master@{#37726}
This commit is contained in:
jochen 2016-07-13 10:44:41 -07:00 committed by Commit bot
parent 31799674e2
commit 906cb204d0
2 changed files with 17 additions and 0 deletions

View File

@ -23,6 +23,7 @@
#include "src/frames-inl.h" #include "src/frames-inl.h"
#include "src/full-codegen/full-codegen.h" #include "src/full-codegen/full-codegen.h"
#include "src/globals.h" #include "src/globals.h"
#include "src/heap/heap.h"
#include "src/interpreter/interpreter.h" #include "src/interpreter/interpreter.h"
#include "src/isolate-inl.h" #include "src/isolate-inl.h"
#include "src/log-inl.h" #include "src/log-inl.h"
@ -705,6 +706,15 @@ bool GetOptimizedCodeLater(CompilationJob* job) {
return false; 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 // 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. // that is detached and handed off to the background thread when we return.
CompilationHandleScope handle_scope(info); CompilationHandleScope handle_scope(info);

View File

@ -4373,6 +4373,13 @@ class MemoryPressureInterruptTask : public CancelableTask {
}; };
void Heap::CheckMemoryPressure() { 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) { if (memory_pressure_level_.Value() == MemoryPressureLevel::kCritical) {
CollectGarbageOnMemoryPressure("memory pressure"); CollectGarbageOnMemoryPressure("memory pressure");
} else if (memory_pressure_level_.Value() == MemoryPressureLevel::kModerate) { } else if (memory_pressure_level_.Value() == MemoryPressureLevel::kModerate) {