| Index: src/mark-compact.cc
|
| diff --git a/src/mark-compact.cc b/src/mark-compact.cc
|
| index 638968506d1c7d159c44bef46fd03a34b0aa8808..980c039792652b442045708b8e2c9d12502594af 100644
|
| --- a/src/mark-compact.cc
|
| +++ b/src/mark-compact.cc
|
| @@ -781,10 +781,12 @@ void MarkCompactCollector::CollectEvacuationCandidates(PagedSpace* space) {
|
| }
|
|
|
| if (FLAG_trace_fragmentation && mode == REDUCE_MEMORY_FOOTPRINT) {
|
| - PrintF("Estimated over reserved memory: %.1f / %.1f MB (threshold %d)\n",
|
| + PrintF("Estimated over reserved memory: %.1f / %.1f MB (threshold %d), "
|
| + "evacuation candidate limit: %d\n",
|
| static_cast<double>(over_reserved) / MB,
|
| static_cast<double>(reserved) / MB,
|
| - static_cast<int>(kFreenessThreshold));
|
| + static_cast<int>(kFreenessThreshold),
|
| + max_evacuation_candidates);
|
| }
|
|
|
| intptr_t estimated_release = 0;
|
| @@ -811,7 +813,7 @@ void MarkCompactCollector::CollectEvacuationCandidates(PagedSpace* space) {
|
| if ((counter & 1) == (page_number & 1)) fragmentation = 1;
|
| } else if (mode == REDUCE_MEMORY_FOOTPRINT) {
|
| // Don't try to release too many pages.
|
| - if (estimated_release >= ((over_reserved * 3) / 4)) {
|
| + if (estimated_release >= over_reserved) {
|
| continue;
|
| }
|
|
|
| @@ -828,7 +830,7 @@ void MarkCompactCollector::CollectEvacuationCandidates(PagedSpace* space) {
|
| int free_pct = static_cast<int>(free_bytes * 100) / p->area_size();
|
|
|
| if (free_pct >= kFreenessThreshold) {
|
| - estimated_release += 2 * p->area_size() - free_bytes;
|
| + estimated_release += free_bytes;
|
| fragmentation = free_pct;
|
| } else {
|
| fragmentation = 0;
|
| @@ -1929,7 +1931,8 @@ static void DiscoverGreyObjectsWithIterator(Heap* heap,
|
| static inline int MarkWordToObjectStarts(uint32_t mark_bits, int* starts);
|
|
|
|
|
| -static void DiscoverGreyObjectsOnPage(MarkingDeque* marking_deque, Page* p) {
|
| +static void DiscoverGreyObjectsOnPage(MarkingDeque* marking_deque,
|
| + MemoryChunk* p) {
|
| ASSERT(!marking_deque->IsFull());
|
| ASSERT(strcmp(Marking::kWhiteBitPattern, "00") == 0);
|
| ASSERT(strcmp(Marking::kBlackBitPattern, "10") == 0);
|
| @@ -2003,6 +2006,18 @@ static void DiscoverGreyObjectsInSpace(Heap* heap,
|
| }
|
|
|
|
|
| +static void DiscoverGreyObjectsInNewSpace(Heap* heap,
|
| + MarkingDeque* marking_deque) {
|
| + NewSpace* space = heap->new_space();
|
| + NewSpacePageIterator it(space->bottom(), space->top());
|
| + while (it.has_next()) {
|
| + NewSpacePage* page = it.next();
|
| + DiscoverGreyObjectsOnPage(marking_deque, page);
|
| + if (marking_deque->IsFull()) return;
|
| + }
|
| +}
|
| +
|
| +
|
| bool MarkCompactCollector::IsUnmarkedHeapObject(Object** p) {
|
| Object* o = *p;
|
| if (!o->IsHeapObject()) return false;
|
| @@ -2109,8 +2124,7 @@ void MarkCompactCollector::EmptyMarkingDeque() {
|
| void MarkCompactCollector::RefillMarkingDeque() {
|
| ASSERT(marking_deque_.overflowed());
|
|
|
| - SemiSpaceIterator new_it(heap()->new_space());
|
| - DiscoverGreyObjectsWithIterator(heap(), &marking_deque_, &new_it);
|
| + DiscoverGreyObjectsInNewSpace(heap(), &marking_deque_);
|
| if (marking_deque_.IsFull()) return;
|
|
|
| DiscoverGreyObjectsInSpace(heap(),
|
|
|