Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(668)

Unified Diff: src/mark-compact.cc

Issue 7891010: Implement shrinking of paged spaces during sweeping. (Closed) Base URL: https://v8.googlecode.com/svn/branches/experimental/gc
Patch Set: Added tracing output. Created 9 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/heap.cc ('k') | src/spaces.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/mark-compact.cc
diff --git a/src/mark-compact.cc b/src/mark-compact.cc
index 4fc9fdba5e974a8c43fa9c4f1872cbc93f01ca1d..0bcac788698cb5efe817b51158668b718883a228 100644
--- a/src/mark-compact.cc
+++ b/src/mark-compact.cc
@@ -2777,23 +2777,6 @@ static inline void UpdateSlot(ObjectVisitor* v,
}
-static inline void UpdateSlotsInRange(Object** start, Object** end) {
- for (Object** slot = start;
- slot < end;
- slot++) {
- Object* obj = *slot;
- if (obj->IsHeapObject() &&
- MarkCompactCollector::IsOnEvacuationCandidate(obj)) {
- MapWord map_word = HeapObject::cast(obj)->map_word();
- if (map_word.IsForwardingAddress()) {
- *slot = map_word.ToForwardingAddress();
- ASSERT(!MarkCompactCollector::IsOnEvacuationCandidate(*slot));
- }
- }
- }
-}
-
-
enum SweepingMode {
SWEEP_ONLY,
SWEEP_AND_VISIT_LIVE_OBJECTS
@@ -3160,52 +3143,6 @@ void MarkCompactCollector::EvacuateNewSpaceAndCandidates() {
}
-INLINE(static uint32_t SweepFree(PagedSpace* space,
- Page* p,
- uint32_t free_start,
- uint32_t region_end,
- uint32_t* cells));
-
-
-static uint32_t SweepFree(PagedSpace* space,
- Page* p,
- uint32_t free_start,
- uint32_t region_end,
- uint32_t* cells) {
- uint32_t free_cell_index = Bitmap::IndexToCell(free_start);
- ASSERT(cells[free_cell_index] == 0);
- while (free_cell_index < region_end && cells[free_cell_index] == 0) {
- free_cell_index++;
- }
-
- if (free_cell_index >= region_end) {
- return free_cell_index;
- }
-
- uint32_t free_end = Bitmap::CellToIndex(free_cell_index);
- space->FreeOrUnmapPage(p,
- p->MarkbitIndexToAddress(free_start),
- (free_end - free_start) << kPointerSizeLog2);
-
- return free_cell_index;
-}
-
-
-INLINE(static uint32_t NextCandidate(uint32_t cell_index,
- uint32_t last_cell_index,
- uint32_t* cells));
-
-
-static uint32_t NextCandidate(uint32_t cell_index,
- uint32_t last_cell_index,
- uint32_t* cells) {
- do {
- cell_index++;
- } while (cell_index < last_cell_index && cells[cell_index] != 0);
- return cell_index;
-}
-
-
static const int kStartTableEntriesPerLine = 5;
static const int kStartTableLines = 171;
static const int kStartTableInvalidLine = 127;
@@ -3589,6 +3526,7 @@ void MarkCompactCollector::SweepSpace(PagedSpace* space,
intptr_t freed_bytes = 0;
intptr_t newspace_size = space->heap()->new_space()->Size();
bool lazy_sweeping_active = false;
+ bool unused_page_present = false;
while (it.has_next()) {
Page* p = it.next();
@@ -3615,6 +3553,19 @@ void MarkCompactCollector::SweepSpace(PagedSpace* space,
continue;
}
+ // One unused page is kept, all further are released before sweeping them.
+ if (p->LiveBytes() == 0) {
+ if (unused_page_present) {
+ if (FLAG_gc_verbose) {
+ PrintF("Sweeping 0x%" V8PRIxPTR " released page.\n",
+ reinterpret_cast<intptr_t>(p));
+ }
+ space->ReleasePage(p);
+ continue;
+ }
+ unused_page_present = true;
+ }
+
if (FLAG_gc_verbose) {
PrintF("Sweeping 0x%" V8PRIxPTR " with sweeper %d.\n",
reinterpret_cast<intptr_t>(p),
@@ -3629,7 +3580,7 @@ void MarkCompactCollector::SweepSpace(PagedSpace* space,
case LAZY_CONSERVATIVE: {
freed_bytes += SweepConservatively(space, p);
if (freed_bytes >= newspace_size && p != space->LastPage()) {
- space->SetPagesToSweep(p->next_page(), space->LastPage());
+ space->SetPagesToSweep(p->next_page(), space->anchor());
lazy_sweeping_active = true;
}
break;
@@ -3647,6 +3598,9 @@ void MarkCompactCollector::SweepSpace(PagedSpace* space,
}
}
}
+
+ // Give pages that are queued to be freed back to the OS.
+ heap()->FreeQueuedChunks();
}
« no previous file with comments | « src/heap.cc ('k') | src/spaces.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698