Mercurial > hg > truffle
comparison 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 |
comparison
equal
deleted
inserted
replaced
940:8624da129f0b | 941:8b46c4d82093 |
---|---|
100 GenMarkSweep::_preserved_oop_stack = NULL; | 100 GenMarkSweep::_preserved_oop_stack = NULL; |
101 | 101 |
102 GenMarkSweep::_marking_stack = | 102 GenMarkSweep::_marking_stack = |
103 new (ResourceObj::C_HEAP) GrowableArray<oop>(4000, true); | 103 new (ResourceObj::C_HEAP) GrowableArray<oop>(4000, true); |
104 | 104 |
105 size_t size = SystemDictionary::number_of_classes() * 2; | 105 int size = SystemDictionary::number_of_classes() * 2; |
106 GenMarkSweep::_revisit_klass_stack = | 106 GenMarkSweep::_revisit_klass_stack = |
107 new (ResourceObj::C_HEAP) GrowableArray<Klass*>((int)size, true); | 107 new (ResourceObj::C_HEAP) GrowableArray<Klass*>(size, true); |
108 // (#klass/k)^2 for k ~ 10 appears a better fit, but this will have to do | |
109 // for now until we have a chance to work out a more optimal setting. | |
110 GenMarkSweep::_revisit_mdo_stack = | |
111 new (ResourceObj::C_HEAP) GrowableArray<DataLayout*>(size*2, true); | |
112 | |
108 } | 113 } |
109 | 114 |
110 void G1MarkSweep::mark_sweep_phase1(bool& marked_for_unloading, | 115 void G1MarkSweep::mark_sweep_phase1(bool& marked_for_unloading, |
111 bool clear_all_softrefs) { | 116 bool clear_all_softrefs) { |
112 // Recursively traverse all live objects and mark them | 117 // Recursively traverse all live objects and mark them |
137 // Follow code cache roots (has to be done after system dictionary, | 142 // Follow code cache roots (has to be done after system dictionary, |
138 // assumes all live klasses are marked) | 143 // assumes all live klasses are marked) |
139 CodeCache::do_unloading(&GenMarkSweep::is_alive, | 144 CodeCache::do_unloading(&GenMarkSweep::is_alive, |
140 &GenMarkSweep::keep_alive, | 145 &GenMarkSweep::keep_alive, |
141 purged_class); | 146 purged_class); |
142 GenMarkSweep::follow_stack(); | 147 GenMarkSweep::follow_stack(); |
143 | 148 |
144 // Update subklass/sibling/implementor links of live klasses | 149 // Update subklass/sibling/implementor links of live klasses |
145 GenMarkSweep::follow_weak_klass_links(); | 150 GenMarkSweep::follow_weak_klass_links(); |
146 assert(GenMarkSweep::_marking_stack->is_empty(), | 151 assert(GenMarkSweep::_marking_stack->is_empty(), |
147 "stack should be empty by now"); | 152 "stack should be empty by now"); |
153 | |
154 // Visit memoized MDO's and clear any unmarked weak refs | |
155 GenMarkSweep::follow_mdo_weak_refs(); | |
156 assert(GenMarkSweep::_marking_stack->is_empty(), "just drained"); | |
157 | |
148 | 158 |
149 // Visit symbol and interned string tables and delete unmarked oops | 159 // Visit symbol and interned string tables and delete unmarked oops |
150 SymbolTable::unlink(&GenMarkSweep::is_alive); | 160 SymbolTable::unlink(&GenMarkSweep::is_alive); |
151 StringTable::unlink(&GenMarkSweep::is_alive); | 161 StringTable::unlink(&GenMarkSweep::is_alive); |
152 | 162 |