| Index: src/mark-compact.cc
|
| diff --git a/src/mark-compact.cc b/src/mark-compact.cc
|
| index 67f6e8e0a7556c89a1f5162ac441ec3da5b4a1c4..97352e69beeef5eb2e6a12dc1f30536cdaef40ae 100644
|
| --- a/src/mark-compact.cc
|
| +++ b/src/mark-compact.cc
|
| @@ -500,12 +500,10 @@ void MarkCompactCollector::CollectEvacuationCandidates(PagedSpace* space) {
|
| space->identity() == OLD_DATA_SPACE ||
|
| space->identity() == CODE_SPACE);
|
|
|
| + static const int kMaxMaxEvacuationCandidates = 1000;
|
| int number_of_pages = space->CountTotalPages();
|
| -
|
| - const int kMaxMaxEvacuationCandidates = 1000;
|
| - int max_evacuation_candidates = Min(
|
| - kMaxMaxEvacuationCandidates,
|
| - static_cast<int>(sqrt(static_cast<double>(number_of_pages / 2)) + 1));
|
| + int max_evacuation_candidates =
|
| + static_cast<int>(sqrt(static_cast<double>(number_of_pages / 2)) + 1);
|
|
|
| if (FLAG_stress_compaction || FLAG_always_compact) {
|
| max_evacuation_candidates = kMaxMaxEvacuationCandidates;
|
| @@ -535,17 +533,28 @@ void MarkCompactCollector::CollectEvacuationCandidates(PagedSpace* space) {
|
| intptr_t over_reserved = reserved - space->SizeOfObjects();
|
| static const intptr_t kFreenessThreshold = 50;
|
|
|
| - if (over_reserved >= 2 * space->AreaSize() &&
|
| - reduce_memory_footprint_) {
|
| - mode = REDUCE_MEMORY_FOOTPRINT;
|
| + if (over_reserved >= 2 * space->AreaSize()) {
|
|
|
| - // We expect that empty pages are easier to compact so slightly bump the
|
| - // limit.
|
| - max_evacuation_candidates += 2;
|
| + // If reduction of memory footprint was requested, we are aggressive
|
| + // about choosing pages to free. We expect that half-empty pages
|
| + // are easier to compact so slightly bump the limit.
|
| + if (reduce_memory_footprint_) {
|
| + mode = REDUCE_MEMORY_FOOTPRINT;
|
| + max_evacuation_candidates += 2;
|
| + }
|
|
|
| - if (FLAG_trace_fragmentation) {
|
| - PrintF("Estimated over reserved memory: %.1f MB (setting threshold %d)\n",
|
| + // If over-usage is very high (more than a third of the space), we
|
| + // try to free all mostly empty pages. We expect that almost empty
|
| + // pages are even easier to compact so bump the limit even more.
|
| + if (over_reserved > reserved / 3) {
|
| + mode = REDUCE_MEMORY_FOOTPRINT;
|
| + max_evacuation_candidates *= 2;
|
| + }
|
| +
|
| + if (FLAG_trace_fragmentation && mode == REDUCE_MEMORY_FOOTPRINT) {
|
| + PrintF("Estimated over reserved memory: %.1f / %.1f MB (threshold %d)\n",
|
| static_cast<double>(over_reserved) / MB,
|
| + static_cast<double>(reserved) / MB,
|
| static_cast<int>(kFreenessThreshold));
|
| }
|
| }
|
| @@ -554,6 +563,9 @@ void MarkCompactCollector::CollectEvacuationCandidates(PagedSpace* space) {
|
|
|
| Candidate candidates[kMaxMaxEvacuationCandidates];
|
|
|
| + max_evacuation_candidates =
|
| + Min(kMaxMaxEvacuationCandidates, max_evacuation_candidates);
|
| +
|
| int count = 0;
|
| int fragmentation = 0;
|
| Candidate* least = NULL;
|
|
|