aboutsummaryrefslogtreecommitdiff
path: root/src/share/vm/memory/genMarkSweep.cpp
diff options
context:
space:
mode:
authorysr <none@none>2009-09-02 00:04:29 -0700
committerysr <none@none>2009-09-02 00:04:29 -0700
commit273b6b8665f9fdce1263fc92e88f7b3d39f705ec (patch)
treed112dc5377f650a91443dae46b7f5979c419d991 /src/share/vm/memory/genMarkSweep.cpp
parent1bcff5aa0d8d415b6a6dd5924a947911a0a5b241 (diff)
downloadjdk8u_hotspot-273b6b8665f9fdce1263fc92e88f7b3d39f705ec.tar.gz
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
Diffstat (limited to 'src/share/vm/memory/genMarkSweep.cpp')
-rw-r--r--src/share/vm/memory/genMarkSweep.cpp8
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);