Index: test/cctest/test-heap.cc |
diff --git a/test/cctest/test-heap.cc b/test/cctest/test-heap.cc |
index 179ca1c63cd1f2add33dfeeaf10fe8081cc89e80..e7ff3d0b26e28aac94b15266921e5d151ff1d860 100644 |
--- a/test/cctest/test-heap.cc |
+++ b/test/cctest/test-heap.cc |
@@ -1899,3 +1899,42 @@ TEST(Regress2143b) { |
CHECK(root->IsJSObject()); |
CHECK(root->map()->IsMap()); |
} |
+ |
+ |
+// Implemented in the test-alloc.cc test suite. |
+void SimulateFullSpace(PagedSpace* space); |
+ |
+ |
+TEST(ReleaseOverReservedPages) { |
+ i::FLAG_trace_gc = true; |
+ InitializeVM(); |
+ v8::HandleScope scope; |
+ static const int number_of_test_pages = 20; |
+ |
+ // Prepare many pages with low live-bytes count. |
+ PagedSpace* old_pointer_space = HEAP->old_pointer_space(); |
+ CHECK_EQ(1, old_pointer_space->CountTotalPages()); |
+ for (int i = 0; i < number_of_test_pages; i++) { |
+ AlwaysAllocateScope always_allocate; |
+ SimulateFullSpace(old_pointer_space); |
+ FACTORY->NewFixedArray(1, TENURED); |
+ } |
+ CHECK_EQ(number_of_test_pages + 1, old_pointer_space->CountTotalPages()); |
+ |
+ // Triggering one GC will cause a lot of garbage to be discovered but |
+ // even spread across all allocated pages. |
+ HEAP->CollectAllGarbage(Heap::kNoGCFlags, "triggered for preparation"); |
+ CHECK_EQ(number_of_test_pages + 1, old_pointer_space->CountTotalPages()); |
+ |
+ // Triggering subsequent GCs should cause at least half of the pages |
+ // to be released to the OS after at most two cycles. |
+ HEAP->CollectAllGarbage(Heap::kNoGCFlags, "triggered by test 1"); |
+ CHECK_GE(number_of_test_pages + 1, old_pointer_space->CountTotalPages()); |
+ HEAP->CollectAllGarbage(Heap::kNoGCFlags, "triggered by test 2"); |
+ CHECK_GE(number_of_test_pages + 1, old_pointer_space->CountTotalPages() * 2); |
+ |
+ // Triggering a last-resort GC should cause all pages to be released |
+ // to the OS so that other processes can seize the memory. |
+ HEAP->CollectAllAvailableGarbage("triggered really hard"); |
+ CHECK_EQ(1, old_pointer_space->CountTotalPages()); |
+} |