| Index: src/heap/mark-compact.cc
|
| diff --git a/src/heap/mark-compact.cc b/src/heap/mark-compact.cc
|
| index 0b331e33f30e59fb7b29e3d178fb049c0dc0d401..b46fd57aff61910ae35516b942cf76483a24c9e2 100644
|
| --- a/src/heap/mark-compact.cc
|
| +++ b/src/heap/mark-compact.cc
|
| @@ -3303,7 +3303,6 @@ void MarkCompactCollector::EvacuatePages(
|
| intptr_t live_bytes = p->LiveBytes();
|
| AlwaysAllocateScope always_allocate(isolate());
|
| if (VisitLiveObjects(p, &visitor, kClearMarkbits)) {
|
| - p->ResetLiveBytes();
|
| p->parallel_compaction_state().SetValue(
|
| MemoryChunk::kCompactingFinalize);
|
| compaction_spaces->ReportCompactionProgress(
|
| @@ -3760,18 +3759,6 @@ void MarkCompactCollector::UpdatePointersAfterEvacuation() {
|
| }
|
|
|
|
|
| -void MarkCompactCollector::MoveEvacuationCandidatesToEndOfPagesList() {
|
| - int npages = evacuation_candidates_.length();
|
| - for (int i = 0; i < npages; i++) {
|
| - Page* p = evacuation_candidates_[i];
|
| - if (!p->IsEvacuationCandidate()) continue;
|
| - p->Unlink();
|
| - PagedSpace* space = static_cast<PagedSpace*>(p->owner());
|
| - p->InsertAfter(space->LastPage());
|
| - }
|
| -}
|
| -
|
| -
|
| void MarkCompactCollector::ReleaseEvacuationCandidates() {
|
| int npages = evacuation_candidates_.length();
|
| for (int i = 0; i < npages; i++) {
|
| @@ -3792,19 +3779,22 @@ void MarkCompactCollector::ReleaseEvacuationCandidates() {
|
|
|
|
|
| int MarkCompactCollector::SweepInParallel(PagedSpace* space,
|
| - int required_freed_bytes) {
|
| + int required_freed_bytes,
|
| + int max_pages) {
|
| int max_freed = 0;
|
| int max_freed_overall = 0;
|
| - PageIterator it(space);
|
| - while (it.has_next()) {
|
| - Page* p = it.next();
|
| + int page_count = 0;
|
| + for (Page* p : sweeping_list(space)) {
|
| max_freed = SweepInParallel(p, space);
|
| DCHECK(max_freed >= 0);
|
| if (required_freed_bytes > 0 && max_freed >= required_freed_bytes) {
|
| return max_freed;
|
| }
|
| max_freed_overall = Max(max_freed, max_freed_overall);
|
| - if (p == space->end_of_unswept_pages()) break;
|
| + page_count++;
|
| + if (max_pages > 0 && page_count >= max_pages) {
|
| + break;
|
| + }
|
| }
|
| return max_freed_overall;
|
| }
|
| @@ -3848,15 +3838,10 @@ int MarkCompactCollector::SweepInParallel(Page* page, PagedSpace* space) {
|
| void MarkCompactCollector::StartSweepSpace(PagedSpace* space) {
|
| space->ClearStats();
|
|
|
| - // We defensively initialize end_of_unswept_pages_ here with the first page
|
| - // of the pages list.
|
| - space->set_end_of_unswept_pages(space->FirstPage());
|
| -
|
| PageIterator it(space);
|
|
|
| - int pages_swept = 0;
|
| + int will_be_swept = 0;
|
| bool unused_page_present = false;
|
| - bool parallel_sweeping_active = false;
|
|
|
| while (it.has_next()) {
|
| Page* p = it.next();
|
| @@ -3894,39 +3879,19 @@ void MarkCompactCollector::StartSweepSpace(PagedSpace* space) {
|
| unused_page_present = true;
|
| }
|
|
|
| - if (!parallel_sweeping_active) {
|
| - if (FLAG_gc_verbose) {
|
| - PrintIsolate(isolate(), "sweeping: %p", p);
|
| - }
|
| - if (space->identity() == CODE_SPACE) {
|
| - if (FLAG_zap_code_space) {
|
| - Sweep<SWEEP_ONLY, SWEEP_ON_MAIN_THREAD, REBUILD_SKIP_LIST,
|
| - ZAP_FREE_SPACE>(space, NULL, p, NULL);
|
| - } else {
|
| - Sweep<SWEEP_ONLY, SWEEP_ON_MAIN_THREAD, REBUILD_SKIP_LIST,
|
| - IGNORE_FREE_SPACE>(space, NULL, p, NULL);
|
| - }
|
| - } else {
|
| - Sweep<SWEEP_ONLY, SWEEP_ON_MAIN_THREAD, IGNORE_SKIP_LIST,
|
| - IGNORE_FREE_SPACE>(space, NULL, p, NULL);
|
| - }
|
| - pages_swept++;
|
| - parallel_sweeping_active = true;
|
| - } else {
|
| - if (FLAG_gc_verbose) {
|
| - PrintIsolate(isolate(), "sweeping: initialized for parallel: %p", p);
|
| - }
|
| - p->parallel_sweeping_state().SetValue(MemoryChunk::kSweepingPending);
|
| - int to_sweep = p->area_size() - p->LiveBytes();
|
| - space->accounting_stats_.ShrinkSpace(to_sweep);
|
| - }
|
| - space->set_end_of_unswept_pages(p);
|
| + sweeping_list(space).push_back(p);
|
| + p->parallel_sweeping_state().SetValue(MemoryChunk::kSweepingPending);
|
| + int to_sweep = p->area_size() - p->LiveBytes();
|
| + space->accounting_stats_.ShrinkSpace(to_sweep);
|
| + will_be_swept++;
|
| }
|
|
|
| if (FLAG_gc_verbose) {
|
| - PrintIsolate(isolate(), "sweeping: space=%s pages_swept=%d",
|
| - AllocationSpaceName(space->identity()), pages_swept);
|
| + PrintIsolate(isolate(), "sweeping: space=%s initialized_for_sweeping=%d",
|
| + AllocationSpaceName(space->identity()), will_be_swept);
|
| }
|
| + std::sort(sweeping_list(space).begin(), sweeping_list(space).end(),
|
| + [](Page* a, Page* b) { return a->LiveBytes() < b->LiveBytes(); });
|
| }
|
|
|
|
|
| @@ -3941,8 +3906,6 @@ void MarkCompactCollector::SweepSpaces() {
|
| state_ = SWEEP_SPACES;
|
| #endif
|
|
|
| - MoveEvacuationCandidatesToEndOfPagesList();
|
| -
|
| {
|
| sweeping_in_progress_ = true;
|
| {
|
| @@ -3980,9 +3943,7 @@ void MarkCompactCollector::SweepSpaces() {
|
|
|
|
|
| void MarkCompactCollector::ParallelSweepSpaceComplete(PagedSpace* space) {
|
| - PageIterator it(space);
|
| - while (it.has_next()) {
|
| - Page* p = it.next();
|
| + for (Page* p : sweeping_list(space)) {
|
| if (p->parallel_sweeping_state().Value() ==
|
| MemoryChunk::kSweepingFinalize) {
|
| p->parallel_sweeping_state().SetValue(MemoryChunk::kSweepingDone);
|
| @@ -3997,6 +3958,9 @@ void MarkCompactCollector::ParallelSweepSpacesComplete() {
|
| ParallelSweepSpaceComplete(heap()->old_space());
|
| ParallelSweepSpaceComplete(heap()->code_space());
|
| ParallelSweepSpaceComplete(heap()->map_space());
|
| + sweeping_list(heap()->old_space()).clear();
|
| + sweeping_list(heap()->code_space()).clear();
|
| + sweeping_list(heap()->map_space()).clear();
|
| }
|
|
|
|
|
|
|