Adjust idle notification handler to do full GC at the end of idle round in order to compact code space.
R=mstarzinger@chromium.org Review URL: https://chromiumcodereview.appspot.com/10639002 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@11900 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
1cff0c498e
commit
3372b08cb0
26
src/heap.cc
26
src/heap.cc
@ -5014,7 +5014,11 @@ void Heap::AdvanceIdleIncrementalMarking(intptr_t step_size) {
|
||||
|
||||
|
||||
bool Heap::IdleNotification(int hint) {
|
||||
// Hints greater than this value indicate that
|
||||
// the embedder is requesting a lot of GC work.
|
||||
const int kMaxHint = 1000;
|
||||
// Minimal hint that allows to do full GC.
|
||||
const int kMinHintForFullGC = 100;
|
||||
intptr_t size_factor = Min(Max(hint, 20), kMaxHint) / 4;
|
||||
// The size factor is in range [5..250]. The numbers here are chosen from
|
||||
// experiments. If you changes them, make sure to test with
|
||||
@ -5082,16 +5086,30 @@ bool Heap::IdleNotification(int hint) {
|
||||
mark_sweeps_since_idle_round_started_ += new_mark_sweeps;
|
||||
ms_count_at_last_idle_notification_ = ms_count_;
|
||||
|
||||
if (mark_sweeps_since_idle_round_started_ >= kMaxMarkSweepsInIdleRound) {
|
||||
int remaining_mark_sweeps = kMaxMarkSweepsInIdleRound -
|
||||
mark_sweeps_since_idle_round_started_;
|
||||
|
||||
if (remaining_mark_sweeps <= 0) {
|
||||
FinishIdleRound();
|
||||
return true;
|
||||
}
|
||||
|
||||
if (incremental_marking()->IsStopped()) {
|
||||
incremental_marking()->Start();
|
||||
// If there are no more than two GCs left in this idle round and we are
|
||||
// allowed to do a full GC, then make those GCs full in order to compact
|
||||
// the code space.
|
||||
// TODO(ulan): Once we enable code compaction for incremental marking,
|
||||
// we can get rid of this special case and always start incremental marking.
|
||||
if (remaining_mark_sweeps <= 2 && hint >= kMinHintForFullGC) {
|
||||
CollectAllGarbage(kReduceMemoryFootprintMask,
|
||||
"idle notification: finalize idle round");
|
||||
} else {
|
||||
incremental_marking()->Start();
|
||||
}
|
||||
}
|
||||
if (!incremental_marking()->IsStopped()) {
|
||||
AdvanceIdleIncrementalMarking(step_size);
|
||||
}
|
||||
|
||||
AdvanceIdleIncrementalMarking(step_size);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user