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

Side by Side Diff: runtime/vm/scavenger.cc

Issue 98693010: - Promote objects early when a large percentage is being (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years 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 | Annotate | Revision Log
« no previous file with comments | « runtime/vm/scavenger.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/scavenger.h" 5 #include "vm/scavenger.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <map> 8 #include <map>
9 #include <utility> 9 #include <utility>
10 10
11 #include "vm/dart.h" 11 #include "vm/dart.h"
12 #include "vm/dart_api_state.h" 12 #include "vm/dart_api_state.h"
13 #include "vm/isolate.h" 13 #include "vm/isolate.h"
14 #include "vm/object.h" 14 #include "vm/object.h"
15 #include "vm/stack_frame.h" 15 #include "vm/stack_frame.h"
16 #include "vm/store_buffer.h" 16 #include "vm/store_buffer.h"
17 #include "vm/verifier.h" 17 #include "vm/verifier.h"
18 #include "vm/visitor.h" 18 #include "vm/visitor.h"
19 #include "vm/weak_table.h" 19 #include "vm/weak_table.h"
20 #include "vm/object_id_ring.h" 20 #include "vm/object_id_ring.h"
21 21
22 namespace dart { 22 namespace dart {
23 23
24 DEFINE_FLAG(int, early_tenuring_threshold, 66, "Skip TO space when promoting"
25 " above this percentage.");
26
24 // Scavenger uses RawObject::kMarkBit to distinguish forwaded and non-forwarded 27 // Scavenger uses RawObject::kMarkBit to distinguish forwaded and non-forwarded
25 // objects. The kMarkBit does not intersect with the target address because of 28 // objects. The kMarkBit does not intersect with the target address because of
26 // object alignment. 29 // object alignment.
27 enum { 30 enum {
28 kForwardingMask = 1 << RawObject::kMarkBit, 31 kForwardingMask = 1 << RawObject::kMarkBit,
29 kNotForwarded = 0, 32 kNotForwarded = 0,
30 kForwarded = kForwardingMask, 33 kForwarded = kForwardingMask,
31 }; 34 };
32 35
33 36
(...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after
362 // objects. 365 // objects.
363 MemoryRegion* temp = from_; 366 MemoryRegion* temp = from_;
364 from_ = to_; 367 from_ = to_;
365 to_ = temp; 368 to_ = temp;
366 top_ = FirstObjectStart(); 369 top_ = FirstObjectStart();
367 resolved_top_ = top_; 370 resolved_top_ = top_;
368 end_ = to_->end(); 371 end_ = to_->end();
369 } 372 }
370 373
371 374
372 void Scavenger::Epilogue(Isolate* isolate, bool invoke_api_callbacks) { 375 void Scavenger::Epilogue(Isolate* isolate,
376 ScavengerVisitor* visitor,
377 bool invoke_api_callbacks) {
373 // All objects in the to space have been copied from the from space at this 378 // All objects in the to space have been copied from the from space at this
374 // moment. 379 // moment.
375 survivor_end_ = top_; 380 int promotion_ratio = static_cast<int>(
381 (static_cast<double>(visitor->bytes_promoted()) /
382 static_cast<double>(to_->size())) * 100.0);
383 if (promotion_ratio < FLAG_early_tenuring_threshold) {
384 // Remember the limit to which objects have been copied.
385 survivor_end_ = top_;
386 } else {
387 // Move survivor end to the end of the to_ space, making all surviving
388 // objects candidates for promotion.
389 survivor_end_ = end_;
390 }
376 391
377 #if defined(DEBUG) 392 #if defined(DEBUG)
378 VerifyStoreBufferPointerVisitor verify_store_buffer_visitor(isolate, to_); 393 VerifyStoreBufferPointerVisitor verify_store_buffer_visitor(isolate, to_);
379 heap_->IterateOldPointers(&verify_store_buffer_visitor); 394 heap_->IterateOldPointers(&verify_store_buffer_visitor);
380 395
381 memset(from_->pointer(), 0xf3, from_->size()); 396 memset(from_->pointer(), 0xf3, from_->size());
382 #endif // defined(DEBUG) 397 #endif // defined(DEBUG)
383 if (invoke_api_callbacks) { 398 if (invoke_api_callbacks) {
384 isolate->gc_epilogue_callbacks().Invoke(); 399 isolate->gc_epilogue_callbacks().Invoke();
385 } 400 }
(...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after
666 ProcessToSpace(&visitor); 681 ProcessToSpace(&visitor);
667 int64_t middle = OS::GetCurrentTimeMicros(); 682 int64_t middle = OS::GetCurrentTimeMicros();
668 IterateWeakReferences(isolate, &visitor); 683 IterateWeakReferences(isolate, &visitor);
669 ScavengerWeakVisitor weak_visitor(this); 684 ScavengerWeakVisitor weak_visitor(this);
670 IterateWeakRoots(isolate, &weak_visitor, invoke_api_callbacks); 685 IterateWeakRoots(isolate, &weak_visitor, invoke_api_callbacks);
671 visitor.Finalize(); 686 visitor.Finalize();
672 ProcessWeakTables(); 687 ProcessWeakTables();
673 int64_t end = OS::GetCurrentTimeMicros(); 688 int64_t end = OS::GetCurrentTimeMicros();
674 heap_->RecordTime(kProcessToSpace, middle - start); 689 heap_->RecordTime(kProcessToSpace, middle - start);
675 heap_->RecordTime(kIterateWeaks, end - middle); 690 heap_->RecordTime(kIterateWeaks, end - middle);
676 Epilogue(isolate, invoke_api_callbacks); 691 Epilogue(isolate, &visitor, invoke_api_callbacks);
677 692
678 if (FLAG_verify_after_gc) { 693 if (FLAG_verify_after_gc) {
679 OS::PrintErr("Verifying after Scavenge..."); 694 OS::PrintErr("Verifying after Scavenge...");
680 heap_->Verify(); 695 heap_->Verify();
681 OS::PrintErr(" done.\n"); 696 OS::PrintErr(" done.\n");
682 } 697 }
683 698
684 // Done scavenging. Reset the marker. 699 // Done scavenging. Reset the marker.
685 ASSERT(scavenging_); 700 ASSERT(scavenging_);
686 scavenging_ = false; 701 scavenging_ = false;
687 } 702 }
688 703
689 704
690 void Scavenger::WriteProtect(bool read_only) { 705 void Scavenger::WriteProtect(bool read_only) {
691 space_->Protect( 706 space_->Protect(
692 read_only ? VirtualMemory::kReadOnly : VirtualMemory::kReadWrite); 707 read_only ? VirtualMemory::kReadOnly : VirtualMemory::kReadWrite);
693 } 708 }
694 709
695 710
696 } // namespace dart 711 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/scavenger.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698