| Index: src/heap/spaces.h | 
| diff --git a/src/heap/spaces.h b/src/heap/spaces.h | 
| index cd5ffd1287e3231d9735051040a8150f541aa41a..7e4bbe126a22e14c0c7daa888f0f7a66d2300ec7 100644 | 
| --- a/src/heap/spaces.h | 
| +++ b/src/heap/spaces.h | 
| @@ -235,7 +235,10 @@ | 
| IN_TO_SPACE,    // All pages in new space has one of these two set. | 
| NEW_SPACE_BELOW_AGE_MARK, | 
| EVACUATION_CANDIDATE, | 
| -    NEVER_EVACUATE,  // May contain immortal immutables. | 
| + | 
| +    // |NEVER_EVACUATE|: A page tagged with this flag will never be selected | 
| +    // for evacuation. Typically used for immortal immovable pages. | 
| +    NEVER_EVACUATE, | 
|  | 
| // Large objects can have a progress bar in their page header. These object | 
| // are scanned in increments and will be kept black while being scanned. | 
| @@ -722,7 +725,7 @@ | 
| // account. | 
| // TODO(hpayer): This limit should be way smaller but we currently have | 
| // short living objects >256K. | 
| -  static const int kMaxRegularHeapObjectSize = 600 * KB; | 
| +  static const int kMaxRegularHeapObjectSize = 400 * KB; | 
|  | 
| static inline Page* ConvertNewToOld(Page* old_page, PagedSpace* new_owner); | 
|  | 
| @@ -822,6 +825,8 @@ | 
| void add_available_in_free_list(intptr_t available) { | 
| available_in_free_list_.Increment(available); | 
| } | 
| + | 
| +  size_t ShrinkToHighWaterMark(); | 
|  | 
| #ifdef DEBUG | 
| void Print(); | 
| @@ -1303,6 +1308,8 @@ | 
| intptr_t commit_area_size, | 
| Executability executable, Space* space); | 
|  | 
| +  void ShrinkChunk(MemoryChunk* chunk, size_t bytes_to_shrink); | 
| + | 
| Address ReserveAlignedMemory(size_t requested, size_t alignment, | 
| base::VirtualMemory* controller); | 
| Address AllocateAlignedMemory(size_t reserve_size, size_t commit_size, | 
| @@ -1618,6 +1625,7 @@ | 
| capacity_ -= size_in_bytes; | 
| size_ -= size_in_bytes; | 
| CHECK_GE(size_, 0); | 
| +    CHECK_GE(capacity_, 0); | 
| } | 
|  | 
| // Allocate from available bytes (available -> size). | 
| @@ -2183,6 +2191,10 @@ | 
| iterator begin() { return iterator(anchor_.next_page()); } | 
| iterator end() { return iterator(&anchor_); } | 
|  | 
| +  // Shrink immortal immovable pages of the space to be exactly the size needed | 
| +  // using the high water mark. | 
| +  void ShrinkImmortalImmovablePages(); | 
| + | 
| protected: | 
| // PagedSpaces that should be included in snapshots have different, i.e., | 
| // smaller, initial pages. | 
|  |