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

Unified Diff: src/heap.cc

Issue 309623007: Tenure allocation sites only when semi-space is maximum size. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 7 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.h ('k') | src/mark-compact.cc » ('j') | src/objects-inl.h » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/heap.cc
diff --git a/src/heap.cc b/src/heap.cc
index ff7a9ff12f20d6f7e37751f7d2bd91fb26939684..8254f61efbc336baa92f5d4f1c7ac863ba9a6a01 100644
--- a/src/heap.cc
+++ b/src/heap.cc
@@ -101,6 +101,7 @@ Heap::Heap()
promotion_rate_(0),
semi_space_copied_object_size_(0),
semi_space_copied_rate_(0),
+ changed_to_max_semi_space_size_(false),
max_gc_pause_(0.0),
total_gc_time_ms_(0.0),
max_alive_after_gc_(0),
@@ -438,6 +439,8 @@ void Heap::GarbageCollectionPrologue() {
if (isolate()->concurrent_osr_enabled()) {
isolate()->optimizing_compiler_thread()->AgeBufferedOsrJobs();
}
+
+ CheckNewSpaceExpansionCriteria();
}
@@ -485,8 +488,13 @@ void Heap::ProcessPretenuringFeedback() {
// If the scratchpad overflowed, we have to iterate over the allocation
// sites list.
+ // TODO(hpayer): We iterate over the whole list of allocation sites when
+ // we grew to the maximum semi-space size to deopt maybe tenured
+ // allocation sites. We could hold the maybe tenured allocation sites
+ // in a seperate data structure if this is a performance problem.
bool use_scratchpad =
- allocation_sites_scratchpad_length_ < kAllocationSiteScratchpadSize;
+ allocation_sites_scratchpad_length_ < kAllocationSiteScratchpadSize &&
+ !changed_to_max_semi_space_size_;
int i = 0;
Object* list_element = allocation_sites_list();
@@ -500,14 +508,15 @@ void Heap::ProcessPretenuringFeedback() {
allocation_mementos_found += site->memento_found_count();
if (site->memento_found_count() > 0) {
active_allocation_sites++;
+ if (site->DigestPretenuringFeedback()) trigger_deoptimization = true;
+ if (site->GetPretenureMode() == TENURED) {
+ tenure_decisions++;
+ } else {
+ dont_tenure_decisions++;
+ }
+ allocation_sites++;
}
- if (site->DigestPretenuringFeedback()) trigger_deoptimization = true;
- if (site->GetPretenureMode() == TENURED) {
- tenure_decisions++;
- } else {
- dont_tenure_decisions++;
- }
- allocation_sites++;
+
if (use_scratchpad) {
i++;
} else {
@@ -1283,6 +1292,7 @@ static void VerifyNonPointerSpacePointers(Heap* heap) {
void Heap::CheckNewSpaceExpansionCriteria() {
+ changed_to_max_semi_space_size_ = false;
if (new_space_.Capacity() < new_space_.MaximumCapacity() &&
survived_since_last_expansion_ > new_space_.Capacity()) {
// Grow the size of new space if there is room to grow, enough data
@@ -1290,6 +1300,9 @@ void Heap::CheckNewSpaceExpansionCriteria() {
// high promotion mode.
new_space_.Grow();
survived_since_last_expansion_ = 0;
+ if (new_space_.IsAtMaximumCapacity()) {
+ changed_to_max_semi_space_size_ = true;
mvstanton 2014/06/02 13:31:25 Is the boolean really needed? Why not just ask new
Hannes Payer (out of office) 2014/06/02 14:56:52 As discussed offline, we need a separate flag to i
+ }
}
}
@@ -1433,8 +1446,6 @@ void Heap::Scavenge() {
// Used for updating survived_since_last_expansion_ at function end.
intptr_t survived_watermark = PromotedSpaceSizeOfObjects();
- CheckNewSpaceExpansionCriteria();
-
SelectScavengingVisitorsTable();
incremental_marking()->PrepareForScavenge();
« no previous file with comments | « src/heap.h ('k') | src/mark-compact.cc » ('j') | src/objects-inl.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698