Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(126)

Unified Diff: src/heap/mark-compact.cc

Issue 1134743002: If marking deque allocation fails, try to make do with a smaller one (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/heap/mark-compact.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/heap/mark-compact.cc
diff --git a/src/heap/mark-compact.cc b/src/heap/mark-compact.cc
index 7e02afa3c9ebe65c982d8dffed41b3819e5574f5..be9938b4a1b5eb9ef06f597728a39a0f53dc5fbf 100644
--- a/src/heap/mark-compact.cc
+++ b/src/heap/mark-compact.cc
@@ -226,6 +226,7 @@ static void VerifyEvacuation(Heap* heap) {
void MarkCompactCollector::SetUp() {
free_list_old_space_.Reset(new FreeList(heap_->old_space()));
+ EnsureMarkingDequeIsCommittedAndInitialize(256 * KB);
}
@@ -2257,20 +2258,44 @@ void MarkCompactCollector::RetainMaps() {
}
-void MarkCompactCollector::EnsureMarkingDequeIsCommittedAndInitialize() {
- if (marking_deque_memory_ == NULL) {
- marking_deque_memory_ = new base::VirtualMemory(4 * MB);
- }
- if (!marking_deque_memory_committed_) {
- if (!marking_deque_memory_->Commit(
- reinterpret_cast<Address>(marking_deque_memory_->address()),
- marking_deque_memory_->size(),
- false)) { // Not executable.
- V8::FatalProcessOutOfMemory("EnsureMarkingDequeIsCommitted");
+void MarkCompactCollector::EnsureMarkingDequeIsCommittedAndInitialize(
+ size_t max_size) {
+ // If the marking deque is too small, we try to allocate a bigger one.
+ // If that fails, make do with a smaller one.
+ for (size_t size = max_size; size >= 256 * KB; size >>= 1) {
+ base::VirtualMemory* memory = marking_deque_memory_;
+ bool is_committed = marking_deque_memory_committed_;
+
+ if (memory == NULL || memory->size() < size) {
+ // If we don't have memory or we only have small memory, then
+ // try to reserve a new one.
+ memory = new base::VirtualMemory(size);
+ is_committed = false;
+ }
+ if (is_committed) return;
+ if (memory->IsReserved() &&
+ memory->Commit(reinterpret_cast<Address>(memory->address()),
+ memory->size(),
+ false)) { // Not executable.
+ if (marking_deque_memory_ != NULL && marking_deque_memory_ != memory) {
+ delete marking_deque_memory_;
+ }
+ marking_deque_memory_ = memory;
+ marking_deque_memory_committed_ = true;
+ InitializeMarkingDeque();
+ return;
+ } else {
+ // Commit failed, so we are under memory pressure. If this was the
+ // previously reserved area we tried to commit, then remove references
+ // to it before deleting it and unreserving it.
+ if (marking_deque_memory_ == memory) {
+ marking_deque_memory_ = NULL;
+ marking_deque_memory_committed_ = false;
+ }
+ delete memory; // Will also unreserve the virtual allocation.
}
- marking_deque_memory_committed_ = true;
- InitializeMarkingDeque();
}
+ V8::FatalProcessOutOfMemory("EnsureMarkingDequeIsCommitted");
}
« no previous file with comments | « src/heap/mark-compact.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698