diff options
Diffstat (limited to 'src/share/vm/memory/genMarkSweep.cpp')
-rw-r--r-- | src/share/vm/memory/genMarkSweep.cpp | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/src/share/vm/memory/genMarkSweep.cpp b/src/share/vm/memory/genMarkSweep.cpp index ba42d5d21..bfc41fb88 100644 --- a/src/share/vm/memory/genMarkSweep.cpp +++ b/src/share/vm/memory/genMarkSweep.cpp @@ -162,6 +162,9 @@ void GenMarkSweep::allocate_stacks() { int size = SystemDictionary::number_of_classes() * 2; _revisit_klass_stack = new (ResourceObj::C_HEAP) GrowableArray<Klass*>(size, true); + // (#klass/k)^2 for k ~ 10 appears to be a better fit, but this will have to do for + // now until we have had a chance to investigate a more optimal setting. + _revisit_mdo_stack = new (ResourceObj::C_HEAP) GrowableArray<DataLayout*>(2*size, true); #ifdef VALIDATE_MARK_SWEEP if (ValidateMarkSweep) { @@ -206,6 +209,7 @@ void GenMarkSweep::deallocate_stacks() { delete _marking_stack; delete _revisit_klass_stack; + delete _revisit_mdo_stack; #ifdef VALIDATE_MARK_SWEEP if (ValidateMarkSweep) { @@ -262,6 +266,10 @@ void GenMarkSweep::mark_sweep_phase1(int level, follow_weak_klass_links(); assert(_marking_stack->is_empty(), "just drained"); + // Visit memoized MDO's and clear any unmarked weak refs + follow_mdo_weak_refs(); + assert(_marking_stack->is_empty(), "just drained"); + // Visit symbol and interned string tables and delete unmarked oops SymbolTable::unlink(&is_alive); StringTable::unlink(&is_alive); |