Mercurial > hg > graal-jvmci-8
diff src/share/vm/gc_implementation/g1/g1MarkSweep.cpp @ 941:8b46c4d82093
4957990: Perm heap bloat in JVM
Summary: Treat ProfileData in MDO's as a source of weak, not strong, roots. Fixes the bug for stop-world collection -- the case of concurrent collection will be fixed separately.
Reviewed-by: jcoomes, jmasa, kvn, never
author | ysr |
---|---|
date | Wed, 02 Sep 2009 00:04:29 -0700 |
parents | bd02caa94611 |
children | 54b3b351d6f9 |
line wrap: on
line diff
--- a/src/share/vm/gc_implementation/g1/g1MarkSweep.cpp Mon Aug 31 05:27:29 2009 -0700 +++ b/src/share/vm/gc_implementation/g1/g1MarkSweep.cpp Wed Sep 02 00:04:29 2009 -0700 @@ -102,9 +102,14 @@ GenMarkSweep::_marking_stack = new (ResourceObj::C_HEAP) GrowableArray<oop>(4000, true); - size_t size = SystemDictionary::number_of_classes() * 2; + int size = SystemDictionary::number_of_classes() * 2; GenMarkSweep::_revisit_klass_stack = - new (ResourceObj::C_HEAP) GrowableArray<Klass*>((int)size, true); + new (ResourceObj::C_HEAP) GrowableArray<Klass*>(size, true); + // (#klass/k)^2 for k ~ 10 appears a better fit, but this will have to do + // for now until we have a chance to work out a more optimal setting. + GenMarkSweep::_revisit_mdo_stack = + new (ResourceObj::C_HEAP) GrowableArray<DataLayout*>(size*2, true); + } void G1MarkSweep::mark_sweep_phase1(bool& marked_for_unloading, @@ -139,13 +144,18 @@ CodeCache::do_unloading(&GenMarkSweep::is_alive, &GenMarkSweep::keep_alive, purged_class); - GenMarkSweep::follow_stack(); + GenMarkSweep::follow_stack(); // Update subklass/sibling/implementor links of live klasses GenMarkSweep::follow_weak_klass_links(); assert(GenMarkSweep::_marking_stack->is_empty(), "stack should be empty by now"); + // Visit memoized MDO's and clear any unmarked weak refs + GenMarkSweep::follow_mdo_weak_refs(); + assert(GenMarkSweep::_marking_stack->is_empty(), "just drained"); + + // Visit symbol and interned string tables and delete unmarked oops SymbolTable::unlink(&GenMarkSweep::is_alive); StringTable::unlink(&GenMarkSweep::is_alive);