Reviewers: Erik Corry,
Description:
Don't allow large object space to grow over the max oldspace limit (fixes
issue
1717)
Please review this at http://codereview.chromium.org/8345040/
SVN Base: http://v8.googlecode.com/svn/branches/bleeding_edge/
Affected files:
M src/heap.cc
M src/spaces.h
M src/spaces.cc
Index: src/heap.cc
===================================================================
--- src/heap.cc (revision 9623)
+++ src/heap.cc (working copy)
@@ -5450,7 +5450,7 @@
// The large object code space may contain code or data. We set the
memory
// to be non-executable here for safety, but this means we need to
enable it
// explicitly when allocating large code objects.
- lo_space_ = new LargeObjectSpace(this, LO_SPACE);
+ lo_space_ = new LargeObjectSpace(this, max_old_generation_size_,
LO_SPACE);
if (lo_space_ == NULL) return false;
if (!lo_space_->Setup()) return false;
if (create_heap_objects) {
Index: src/spaces.cc
===================================================================
--- src/spaces.cc (revision 9623)
+++ src/spaces.cc (working copy)
@@ -2278,8 +2278,11 @@
//
-----------------------------------------------------------------------------
// LargeObjectSpace
-LargeObjectSpace::LargeObjectSpace(Heap* heap, AllocationSpace id)
+LargeObjectSpace::LargeObjectSpace(Heap* heap,
+ intptr_t max_capacity,
+ AllocationSpace id)
: Space(heap, id, NOT_EXECUTABLE), // Managed on a per-allocation
basis
+ max_capacity_(max_capacity),
first_page_(NULL),
size_(0),
page_count_(0),
@@ -2319,6 +2322,10 @@
return Failure::RetryAfterGC(identity());
}
+ if (Size() + object_size > max_capacity_) {
+ return Failure::RetryAfterGC(identity());
+ }
+
LargePage* page = heap()->isolate()->memory_allocator()->
AllocateLargePage(object_size, executable, this);
if (page == NULL) return Failure::RetryAfterGC(identity());
Index: src/spaces.h
===================================================================
--- src/spaces.h (revision 9624)
+++ src/spaces.h (working copy)
@@ -2442,7 +2442,7 @@
class LargeObjectSpace : public Space {
public:
- LargeObjectSpace(Heap* heap, AllocationSpace id);
+ LargeObjectSpace(Heap* heap, intptr_t max_capacity, AllocationSpace id);
virtual ~LargeObjectSpace() {}
// Initializes internal data structures.
@@ -2512,6 +2512,7 @@
bool SlowContains(Address addr) { return !FindObject(addr)->IsFailure();
}
private:
+ intptr_t max_capacity_;
// The head of the linked list of large object chunks.
LargePage* first_page_;
intptr_t size_; // allocated bytes
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev