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

Side by Side Diff: src/heap/mark-compact.cc

Issue 1016803002: Remove PropertyCell space (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 9 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 unified diff | Download patch
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/v8.h" 5 #include "src/v8.h"
6 6
7 #include "src/base/atomicops.h" 7 #include "src/base/atomicops.h"
8 #include "src/base/bits.h" 8 #include "src/base/bits.h"
9 #include "src/code-stubs.h" 9 #include "src/code-stubs.h"
10 #include "src/compilation-cache.h" 10 #include "src/compilation-cache.h"
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
132 VerifyMarking(space->heap(), p->area_start(), p->area_end()); 132 VerifyMarking(space->heap(), p->area_start(), p->area_end());
133 } 133 }
134 } 134 }
135 135
136 136
137 static void VerifyMarking(Heap* heap) { 137 static void VerifyMarking(Heap* heap) {
138 VerifyMarking(heap->old_pointer_space()); 138 VerifyMarking(heap->old_pointer_space());
139 VerifyMarking(heap->old_data_space()); 139 VerifyMarking(heap->old_data_space());
140 VerifyMarking(heap->code_space()); 140 VerifyMarking(heap->code_space());
141 VerifyMarking(heap->cell_space()); 141 VerifyMarking(heap->cell_space());
142 VerifyMarking(heap->property_cell_space());
143 VerifyMarking(heap->map_space()); 142 VerifyMarking(heap->map_space());
144 VerifyMarking(heap->new_space()); 143 VerifyMarking(heap->new_space());
145 144
146 VerifyMarkingVisitor visitor(heap); 145 VerifyMarkingVisitor visitor(heap);
147 146
148 LargeObjectIterator it(heap->lo_space()); 147 LargeObjectIterator it(heap->lo_space());
149 for (HeapObject* obj = it.Next(); obj != NULL; obj = it.Next()) { 148 for (HeapObject* obj = it.Next(); obj != NULL; obj = it.Next()) {
150 if (MarkCompactCollector::IsMarked(obj)) { 149 if (MarkCompactCollector::IsMarked(obj)) {
151 obj->Iterate(&visitor); 150 obj->Iterate(&visitor);
152 } 151 }
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
213 VerifyEvacuation(p); 212 VerifyEvacuation(p);
214 } 213 }
215 } 214 }
216 215
217 216
218 static void VerifyEvacuation(Heap* heap) { 217 static void VerifyEvacuation(Heap* heap) {
219 VerifyEvacuation(heap, heap->old_pointer_space()); 218 VerifyEvacuation(heap, heap->old_pointer_space());
220 VerifyEvacuation(heap, heap->old_data_space()); 219 VerifyEvacuation(heap, heap->old_data_space());
221 VerifyEvacuation(heap, heap->code_space()); 220 VerifyEvacuation(heap, heap->code_space());
222 VerifyEvacuation(heap, heap->cell_space()); 221 VerifyEvacuation(heap, heap->cell_space());
223 VerifyEvacuation(heap, heap->property_cell_space());
224 VerifyEvacuation(heap, heap->map_space()); 222 VerifyEvacuation(heap, heap->map_space());
225 VerifyEvacuation(heap->new_space()); 223 VerifyEvacuation(heap->new_space());
226 224
227 VerifyEvacuationVisitor visitor; 225 VerifyEvacuationVisitor visitor;
228 heap->IterateStrongRoots(&visitor, VISIT_ALL); 226 heap->IterateStrongRoots(&visitor, VISIT_ALL);
229 } 227 }
230 #endif // VERIFY_HEAP 228 #endif // VERIFY_HEAP
231 229
232 230
233 void MarkCompactCollector::SetUp() { 231 void MarkCompactCollector::SetUp() {
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
269 if (FLAG_compact_code_space && (mode == NON_INCREMENTAL_COMPACTION || 267 if (FLAG_compact_code_space && (mode == NON_INCREMENTAL_COMPACTION ||
270 FLAG_incremental_code_compaction)) { 268 FLAG_incremental_code_compaction)) {
271 CollectEvacuationCandidates(heap()->code_space()); 269 CollectEvacuationCandidates(heap()->code_space());
272 } else if (FLAG_trace_fragmentation) { 270 } else if (FLAG_trace_fragmentation) {
273 TraceFragmentation(heap()->code_space()); 271 TraceFragmentation(heap()->code_space());
274 } 272 }
275 273
276 if (FLAG_trace_fragmentation) { 274 if (FLAG_trace_fragmentation) {
277 TraceFragmentation(heap()->map_space()); 275 TraceFragmentation(heap()->map_space());
278 TraceFragmentation(heap()->cell_space()); 276 TraceFragmentation(heap()->cell_space());
279 TraceFragmentation(heap()->property_cell_space());
280 } 277 }
281 278
282 heap()->old_pointer_space()->EvictEvacuationCandidatesFromFreeLists(); 279 heap()->old_pointer_space()->EvictEvacuationCandidatesFromFreeLists();
283 heap()->old_data_space()->EvictEvacuationCandidatesFromFreeLists(); 280 heap()->old_data_space()->EvictEvacuationCandidatesFromFreeLists();
284 heap()->code_space()->EvictEvacuationCandidatesFromFreeLists(); 281 heap()->code_space()->EvictEvacuationCandidatesFromFreeLists();
285 282
286 compacting_ = evacuation_candidates_.length() > 0; 283 compacting_ = evacuation_candidates_.length() > 0;
287 } 284 }
288 285
289 return compacting_; 286 return compacting_;
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
364 CHECK_EQ(0, p->LiveBytes()); 361 CHECK_EQ(0, p->LiveBytes());
365 } 362 }
366 } 363 }
367 364
368 365
369 void MarkCompactCollector::VerifyMarkbitsAreClean() { 366 void MarkCompactCollector::VerifyMarkbitsAreClean() {
370 VerifyMarkbitsAreClean(heap_->old_pointer_space()); 367 VerifyMarkbitsAreClean(heap_->old_pointer_space());
371 VerifyMarkbitsAreClean(heap_->old_data_space()); 368 VerifyMarkbitsAreClean(heap_->old_data_space());
372 VerifyMarkbitsAreClean(heap_->code_space()); 369 VerifyMarkbitsAreClean(heap_->code_space());
373 VerifyMarkbitsAreClean(heap_->cell_space()); 370 VerifyMarkbitsAreClean(heap_->cell_space());
374 VerifyMarkbitsAreClean(heap_->property_cell_space());
375 VerifyMarkbitsAreClean(heap_->map_space()); 371 VerifyMarkbitsAreClean(heap_->map_space());
376 VerifyMarkbitsAreClean(heap_->new_space()); 372 VerifyMarkbitsAreClean(heap_->new_space());
377 373
378 LargeObjectIterator it(heap_->lo_space()); 374 LargeObjectIterator it(heap_->lo_space());
379 for (HeapObject* obj = it.Next(); obj != NULL; obj = it.Next()) { 375 for (HeapObject* obj = it.Next(); obj != NULL; obj = it.Next()) {
380 MarkBit mark_bit = Marking::MarkBitFrom(obj); 376 MarkBit mark_bit = Marking::MarkBitFrom(obj);
381 CHECK(Marking::IsWhite(mark_bit)); 377 CHECK(Marking::IsWhite(mark_bit));
382 CHECK_EQ(0, Page::FromAddress(obj->address())->LiveBytes()); 378 CHECK_EQ(0, Page::FromAddress(obj->address())->LiveBytes());
383 } 379 }
384 } 380 }
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
423 } 419 }
424 } 420 }
425 421
426 422
427 void MarkCompactCollector::ClearMarkbits() { 423 void MarkCompactCollector::ClearMarkbits() {
428 ClearMarkbitsInPagedSpace(heap_->code_space()); 424 ClearMarkbitsInPagedSpace(heap_->code_space());
429 ClearMarkbitsInPagedSpace(heap_->map_space()); 425 ClearMarkbitsInPagedSpace(heap_->map_space());
430 ClearMarkbitsInPagedSpace(heap_->old_pointer_space()); 426 ClearMarkbitsInPagedSpace(heap_->old_pointer_space());
431 ClearMarkbitsInPagedSpace(heap_->old_data_space()); 427 ClearMarkbitsInPagedSpace(heap_->old_data_space());
432 ClearMarkbitsInPagedSpace(heap_->cell_space()); 428 ClearMarkbitsInPagedSpace(heap_->cell_space());
433 ClearMarkbitsInPagedSpace(heap_->property_cell_space());
434 ClearMarkbitsInNewSpace(heap_->new_space()); 429 ClearMarkbitsInNewSpace(heap_->new_space());
435 430
436 LargeObjectIterator it(heap_->lo_space()); 431 LargeObjectIterator it(heap_->lo_space());
437 for (HeapObject* obj = it.Next(); obj != NULL; obj = it.Next()) { 432 for (HeapObject* obj = it.Next(); obj != NULL; obj = it.Next()) {
438 MarkBit mark_bit = Marking::MarkBitFrom(obj); 433 MarkBit mark_bit = Marking::MarkBitFrom(obj);
439 mark_bit.Clear(); 434 mark_bit.Clear();
440 mark_bit.Next().Clear(); 435 mark_bit.Next().Clear();
441 Page::FromAddress(obj->address())->ResetProgressBar(); 436 Page::FromAddress(obj->address())->ResetProgressBar();
442 Page::FromAddress(obj->address())->ResetLiveBytes(); 437 Page::FromAddress(obj->address())->ResetLiveBytes();
443 } 438 }
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
581 case OLD_POINTER_SPACE: 576 case OLD_POINTER_SPACE:
582 return "OLD_POINTER_SPACE"; 577 return "OLD_POINTER_SPACE";
583 case OLD_DATA_SPACE: 578 case OLD_DATA_SPACE:
584 return "OLD_DATA_SPACE"; 579 return "OLD_DATA_SPACE";
585 case CODE_SPACE: 580 case CODE_SPACE:
586 return "CODE_SPACE"; 581 return "CODE_SPACE";
587 case MAP_SPACE: 582 case MAP_SPACE:
588 return "MAP_SPACE"; 583 return "MAP_SPACE";
589 case CELL_SPACE: 584 case CELL_SPACE:
590 return "CELL_SPACE"; 585 return "CELL_SPACE";
591 case PROPERTY_CELL_SPACE:
592 return "PROPERTY_CELL_SPACE";
593 case LO_SPACE: 586 case LO_SPACE:
594 return "LO_SPACE"; 587 return "LO_SPACE";
595 default: 588 default:
596 UNREACHABLE(); 589 UNREACHABLE();
597 } 590 }
598 591
599 return NULL; 592 return NULL;
600 } 593 }
601 594
602 595
(...skipping 1450 matching lines...) Expand 10 before | Expand all | Expand 10 after
2053 2046
2054 DiscoverGreyObjectsInSpace(heap(), &marking_deque_, heap()->code_space()); 2047 DiscoverGreyObjectsInSpace(heap(), &marking_deque_, heap()->code_space());
2055 if (marking_deque_.IsFull()) return; 2048 if (marking_deque_.IsFull()) return;
2056 2049
2057 DiscoverGreyObjectsInSpace(heap(), &marking_deque_, heap()->map_space()); 2050 DiscoverGreyObjectsInSpace(heap(), &marking_deque_, heap()->map_space());
2058 if (marking_deque_.IsFull()) return; 2051 if (marking_deque_.IsFull()) return;
2059 2052
2060 DiscoverGreyObjectsInSpace(heap(), &marking_deque_, heap()->cell_space()); 2053 DiscoverGreyObjectsInSpace(heap(), &marking_deque_, heap()->cell_space());
2061 if (marking_deque_.IsFull()) return; 2054 if (marking_deque_.IsFull()) return;
2062 2055
2063 DiscoverGreyObjectsInSpace(heap(), &marking_deque_,
2064 heap()->property_cell_space());
2065 if (marking_deque_.IsFull()) return;
2066
2067 LargeObjectIterator lo_it(heap()->lo_space()); 2056 LargeObjectIterator lo_it(heap()->lo_space());
2068 DiscoverGreyObjectsWithIterator(heap(), &marking_deque_, &lo_it); 2057 DiscoverGreyObjectsWithIterator(heap(), &marking_deque_, &lo_it);
2069 if (marking_deque_.IsFull()) return; 2058 if (marking_deque_.IsFull()) return;
2070 2059
2071 marking_deque_.ClearOverflowed(); 2060 marking_deque_.ClearOverflowed();
2072 } 2061 }
2073 2062
2074 2063
2075 // Mark all objects reachable (transitively) from objects on the marking 2064 // Mark all objects reachable (transitively) from objects on the marking
2076 // stack. Before: the marking stack contains zero or more heap object 2065 // stack. Before: the marking stack contains zero or more heap object
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after
2261 HeapObject* cell; 2250 HeapObject* cell;
2262 while ((cell = cell_iterator.Next()) != NULL) { 2251 while ((cell = cell_iterator.Next()) != NULL) {
2263 DCHECK(cell->IsCell()); 2252 DCHECK(cell->IsCell());
2264 if (IsMarked(cell)) { 2253 if (IsMarked(cell)) {
2265 int offset = Cell::kValueOffset; 2254 int offset = Cell::kValueOffset;
2266 MarkCompactMarkingVisitor::VisitPointer( 2255 MarkCompactMarkingVisitor::VisitPointer(
2267 heap(), reinterpret_cast<Object**>(cell->address() + offset)); 2256 heap(), reinterpret_cast<Object**>(cell->address() + offset));
2268 } 2257 }
2269 } 2258 }
2270 } 2259 }
2271 {
2272 HeapObjectIterator js_global_property_cell_iterator(
2273 heap()->property_cell_space());
2274 HeapObject* cell;
2275 while ((cell = js_global_property_cell_iterator.Next()) != NULL) {
2276 DCHECK(cell->IsPropertyCell());
2277 if (IsMarked(cell)) {
2278 MarkCompactMarkingVisitor::VisitPropertyCell(cell->map(), cell);
2279 }
2280 }
2281 }
2282 } 2260 }
2283 2261
2284 RootMarkingVisitor root_visitor(heap()); 2262 RootMarkingVisitor root_visitor(heap());
2285 MarkRoots(&root_visitor); 2263 MarkRoots(&root_visitor);
2286 2264
2287 ProcessTopOptimizedFrame(&root_visitor); 2265 ProcessTopOptimizedFrame(&root_visitor);
2288 2266
2289 // Retaining dying maps should happen before or during ephemeral marking 2267 // Retaining dying maps should happen before or during ephemeral marking
2290 // because a map could keep the key of an ephemeron alive. Note that map 2268 // because a map could keep the key of an ephemeron alive. Note that map
2291 // aging is imprecise: maps that are kept alive only by ephemerons will age. 2269 // aging is imprecise: maps that are kept alive only by ephemerons will age.
(...skipping 636 matching lines...) Expand 10 before | Expand all | Expand 10 after
2928 } else if (heap->old_pointer_space()->ContainsSafe(slot_address)) { 2906 } else if (heap->old_pointer_space()->ContainsSafe(slot_address)) {
2929 space_owner_id = 3; 2907 space_owner_id = 3;
2930 } else if (heap->old_data_space()->ContainsSafe(slot_address)) { 2908 } else if (heap->old_data_space()->ContainsSafe(slot_address)) {
2931 space_owner_id = 4; 2909 space_owner_id = 4;
2932 } else if (heap->code_space()->ContainsSafe(slot_address)) { 2910 } else if (heap->code_space()->ContainsSafe(slot_address)) {
2933 space_owner_id = 5; 2911 space_owner_id = 5;
2934 } else if (heap->map_space()->ContainsSafe(slot_address)) { 2912 } else if (heap->map_space()->ContainsSafe(slot_address)) {
2935 space_owner_id = 6; 2913 space_owner_id = 6;
2936 } else if (heap->cell_space()->ContainsSafe(slot_address)) { 2914 } else if (heap->cell_space()->ContainsSafe(slot_address)) {
2937 space_owner_id = 7; 2915 space_owner_id = 7;
2938 } else if (heap->property_cell_space()->ContainsSafe(slot_address)) {
2939 space_owner_id = 8;
2940 } else { 2916 } else {
2941 // Lo space or other. 2917 // Lo space or other.
2942 space_owner_id = 9; 2918 space_owner_id = 8;
2943 } 2919 }
2944 data[index++] = space_owner_id; 2920 data[index++] = space_owner_id;
2945 data[index++] = 0x20aaaaaaaaUL; 2921 data[index++] = 0x20aaaaaaaaUL;
2946 2922
2947 // Find map word lying near before the slot address (usually the map word is 2923 // Find map word lying near before the slot address (usually the map word is
2948 // at -3 words from the slot but just in case we look up further. 2924 // at -3 words from the slot but just in case we look up further.
2949 Object** map_slot = slot; 2925 Object** map_slot = slot;
2950 bool found = false; 2926 bool found = false;
2951 const int kMaxDistanceToMap = 64; 2927 const int kMaxDistanceToMap = 64;
2952 for (int i = 0; i < kMaxDistanceToMap; i++, map_slot--) { 2928 for (int i = 0; i < kMaxDistanceToMap; i++, map_slot--) {
(...skipping 784 matching lines...) Expand 10 before | Expand all | Expand 10 after
3737 3713
3738 // Update pointers from cells. 3714 // Update pointers from cells.
3739 HeapObjectIterator cell_iterator(heap_->cell_space()); 3715 HeapObjectIterator cell_iterator(heap_->cell_space());
3740 for (HeapObject* cell = cell_iterator.Next(); cell != NULL; 3716 for (HeapObject* cell = cell_iterator.Next(); cell != NULL;
3741 cell = cell_iterator.Next()) { 3717 cell = cell_iterator.Next()) {
3742 if (cell->IsCell()) { 3718 if (cell->IsCell()) {
3743 Cell::BodyDescriptor::IterateBody(cell, &updating_visitor); 3719 Cell::BodyDescriptor::IterateBody(cell, &updating_visitor);
3744 } 3720 }
3745 } 3721 }
3746 3722
3747 HeapObjectIterator js_global_property_cell_iterator(
3748 heap_->property_cell_space());
3749 for (HeapObject* cell = js_global_property_cell_iterator.Next(); cell != NULL;
3750 cell = js_global_property_cell_iterator.Next()) {
3751 if (cell->IsPropertyCell()) {
3752 PropertyCell::BodyDescriptor::IterateBody(cell, &updating_visitor);
3753 }
3754 }
3755
3756 heap_->string_table()->Iterate(&updating_visitor); 3723 heap_->string_table()->Iterate(&updating_visitor);
3757 3724
3758 // Update pointers from external string table. 3725 // Update pointers from external string table.
3759 heap_->UpdateReferencesInExternalStringTable( 3726 heap_->UpdateReferencesInExternalStringTable(
3760 &UpdateReferenceInExternalStringTableEntry); 3727 &UpdateReferenceInExternalStringTableEntry);
3761 3728
3762 EvacuationWeakObjectRetainer evacuation_object_retainer; 3729 EvacuationWeakObjectRetainer evacuation_object_retainer;
3763 heap()->ProcessAllWeakReferences(&evacuation_object_retainer); 3730 heap()->ProcessAllWeakReferences(&evacuation_object_retainer);
3764 3731
3765 // Collects callback info for handles that are pending (about to be 3732 // Collects callback info for handles that are pending (about to be
(...skipping 603 matching lines...) Expand 10 before | Expand all | Expand 10 after
4369 { 4336 {
4370 GCTracer::Scope sweep_scope(heap()->tracer(), 4337 GCTracer::Scope sweep_scope(heap()->tracer(),
4371 GCTracer::Scope::MC_SWEEP_CODE); 4338 GCTracer::Scope::MC_SWEEP_CODE);
4372 SweepSpace(heap()->code_space(), SEQUENTIAL_SWEEPING); 4339 SweepSpace(heap()->code_space(), SEQUENTIAL_SWEEPING);
4373 } 4340 }
4374 4341
4375 { 4342 {
4376 GCTracer::Scope sweep_scope(heap()->tracer(), 4343 GCTracer::Scope sweep_scope(heap()->tracer(),
4377 GCTracer::Scope::MC_SWEEP_CELL); 4344 GCTracer::Scope::MC_SWEEP_CELL);
4378 SweepSpace(heap()->cell_space(), SEQUENTIAL_SWEEPING); 4345 SweepSpace(heap()->cell_space(), SEQUENTIAL_SWEEPING);
4379 SweepSpace(heap()->property_cell_space(), SEQUENTIAL_SWEEPING);
4380 } 4346 }
4381 4347
4382 EvacuateNewSpaceAndCandidates(); 4348 EvacuateNewSpaceAndCandidates();
4383 4349
4384 // ClearNonLiveReferences depends on precise sweeping of map space to 4350 // ClearNonLiveReferences depends on precise sweeping of map space to
4385 // detect whether unmarked map became dead in this collection or in one 4351 // detect whether unmarked map became dead in this collection or in one
4386 // of the previous ones. 4352 // of the previous ones.
4387 { 4353 {
4388 GCTracer::Scope sweep_scope(heap()->tracer(), 4354 GCTracer::Scope sweep_scope(heap()->tracer(),
4389 GCTracer::Scope::MC_SWEEP_MAP); 4355 GCTracer::Scope::MC_SWEEP_MAP);
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after
4626 SlotsBuffer* buffer = *buffer_address; 4592 SlotsBuffer* buffer = *buffer_address;
4627 while (buffer != NULL) { 4593 while (buffer != NULL) {
4628 SlotsBuffer* next_buffer = buffer->next(); 4594 SlotsBuffer* next_buffer = buffer->next();
4629 DeallocateBuffer(buffer); 4595 DeallocateBuffer(buffer);
4630 buffer = next_buffer; 4596 buffer = next_buffer;
4631 } 4597 }
4632 *buffer_address = NULL; 4598 *buffer_address = NULL;
4633 } 4599 }
4634 } 4600 }
4635 } // namespace v8::internal 4601 } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/heap/incremental-marking.cc ('k') | src/heap/spaces.h » ('j') | src/objects-inl.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698