diff --git a/src/heap.cc b/src/heap.cc index 7c9177859f..8ea1136aab 100644 --- a/src/heap.cc +++ b/src/heap.cc @@ -74,7 +74,7 @@ int Heap::semispace_size_ = 512*KB; int Heap::old_generation_size_ = 128*MB; int Heap::initial_semispace_size_ = 128*KB; #else -int Heap::semispace_size_ = 8*MB; +int Heap::semispace_size_ = 4*MB; int Heap::old_generation_size_ = 512*MB; int Heap::initial_semispace_size_ = 512*KB; #endif @@ -641,11 +641,11 @@ void Heap::Scavenge() { if (new_space_.Capacity() < new_space_.MaximumCapacity() && survived_since_last_expansion_ > new_space_.Capacity()) { - // Double the size of new space if there is room to grow and enough + // Grow the size of new space if there is room to grow and enough // data has survived scavenge since the last expansion. - // TODO(1240712): NewSpace::Double has a return value which is + // TODO(1240712): NewSpace::Grow has a return value which is // ignored here. - new_space_.Double(); + new_space_.Grow(); survived_since_last_expansion_ = 0; } diff --git a/src/spaces.cc b/src/spaces.cc index 4f8119fe1d..6283bbad93 100644 --- a/src/spaces.cc +++ b/src/spaces.cc @@ -963,13 +963,13 @@ void NewSpace::Flip() { } -bool NewSpace::Double() { - ASSERT(capacity_ <= maximum_capacity_ / 2); +bool NewSpace::Grow() { + ASSERT(capacity_ < maximum_capacity_); // TODO(1240712): Failure to double the from space can result in // semispaces of different sizes. In the event of that failure, the // to space doubling should be rolled back before returning false. - if (!to_space_.Double() || !from_space_.Double()) return false; - capacity_ *= 2; + if (!to_space_.Grow() || !from_space_.Grow()) return false; + capacity_ = to_space_.Capacity() + from_space_.Capacity(); allocation_info_.limit = to_space_.high(); ASSERT_SEMISPACE_ALLOCATION_INFO(allocation_info_, to_space_); return true; @@ -1074,11 +1074,16 @@ void SemiSpace::TearDown() { } -bool SemiSpace::Double() { - if (!MemoryAllocator::CommitBlock(high(), capacity_, executable())) { +bool SemiSpace::Grow() { + // Commit 50% extra space but only up to maximum capacity. + int extra = capacity_/2; + if (capacity_ + extra > maximum_capacity_) { + extra = maximum_capacity_ - capacity_; + } + if (!MemoryAllocator::CommitBlock(high(), extra, executable())) { return false; } - capacity_ *= 2; + capacity_ += extra; return true; } diff --git a/src/spaces.h b/src/spaces.h index 57e7c1fac5..4df3388e9c 100644 --- a/src/spaces.h +++ b/src/spaces.h @@ -997,11 +997,11 @@ class SemiSpace : public Space { // True if the space has been set up but not torn down. bool HasBeenSetup() { return start_ != NULL; } - // Double the size of the semispace by committing extra virtual memory. + // Grow the size of the semispace by committing extra virtual memory. // Assumes that the caller has checked that the semispace has not reached // its maximum capacity (and thus there is space available in the reserved // address range to grow). - bool Double(); + bool Grow(); // Returns the start address of the space. Address low() { return start_; } @@ -1040,6 +1040,9 @@ class SemiSpace : public Space { virtual void Verify(); #endif + // Returns the current capacity of the semi space. + int Capacity() { return capacity_; } + private: // The current and maximum capacity of the space. int capacity_; @@ -1131,9 +1134,9 @@ class NewSpace : public Space { // Flip the pair of spaces. void Flip(); - // Doubles the capacity of the semispaces. Assumes that they are not at + // Grow the capacity of the semispaces. Assumes that they are not at // their maximum capacity. Returns a flag indicating success or failure. - bool Double(); + bool Grow(); // True if the address or object lies in the address range of either // semispace (not necessarily below the allocation pointer).