--- a/hotspot/src/share/vm/gc_implementation/g1/g1MarkSweep.cpp Fri Sep 18 09:57:47 2009 -0700
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1MarkSweep.cpp Wed Sep 23 23:56:15 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,
@@ -141,13 +146,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);