comparison src/share/vm/gc_implementation/shared/vmGCOperations.cpp @ 6820:097d78aaf2b5

7198873: NPG: VM Does not unload classes with UseConcMarkSweepGC Reviewed-by: johnc, mgerdin, jwilhelm
author jmasa
date Thu, 04 Oct 2012 10:40:23 -0700
parents 8da5e203b993
children 16fb9f942703 db9981fd3124
comparison
equal deleted inserted replaced
6818:22b8d3d181d9 6820:097d78aaf2b5
196 SvcGCMarker sgcm(SvcGCMarker::FULL); 196 SvcGCMarker sgcm(SvcGCMarker::FULL);
197 197
198 CollectedHeap* heap = Universe::heap(); 198 CollectedHeap* heap = Universe::heap();
199 GCCauseSetter gccs(heap, _gc_cause); 199 GCCauseSetter gccs(heap, _gc_cause);
200 200
201 bool do_cms_concurrent = false;
202
203 // Check again if the space is available. Another thread 201 // Check again if the space is available. Another thread
204 // may have similarly failed a metadata allocation and induced 202 // may have similarly failed a metadata allocation and induced
205 // a GC that freed space for the allocation. 203 // a GC that freed space for the allocation.
206 if (!MetadataAllocationFailALot) { 204 if (!MetadataAllocationFailALot) {
207 _result = _loader_data->metaspace_non_null()->allocate(_size, _mdtype); 205 _result = _loader_data->metaspace_non_null()->allocate(_size, _mdtype);
208 } 206 }
209 207
210 if (_result == NULL) { 208 if (_result == NULL) {
211 if (!UseConcMarkSweepGC) { 209 if (UseConcMarkSweepGC) {
212 // Don't clear the soft refs the first time. 210 if (CMSClassUnloadingEnabled) {
211 MetaspaceGC::set_should_concurrent_collect(true);
212 }
213 // For CMS expand since the collection is going to be concurrent.
214 _result =
215 _loader_data->metaspace_non_null()->expand_and_allocate(_size, _mdtype);
216 }
217 if (_result == NULL) {
218 // Don't clear the soft refs. This GC is for reclaiming metadata
219 // and is unrelated to the fullness of the Java heap which should
220 // be the criteria for clearing SoftReferences.
221 if (Verbose && PrintGCDetails && UseConcMarkSweepGC) {
222 gclog_or_tty->print_cr("\nCMS full GC for Metaspace");
223 }
213 heap->collect_as_vm_thread(GCCause::_metadata_GC_threshold); 224 heap->collect_as_vm_thread(GCCause::_metadata_GC_threshold);
214 _result = _loader_data->metaspace_non_null()->allocate(_size, _mdtype); 225 _result = _loader_data->metaspace_non_null()->allocate(_size, _mdtype);
215 // Don't do this for now 226 }
216 // This seems too costly to do a second full GC 227 if (_result == NULL && !UseConcMarkSweepGC /* CMS already tried */) {
217 // Let the metaspace grow instead
218 // if (_result == NULL) {
219 // // If allocation fails again, clear soft refs
220 // heap->collect_as_vm_thread(GCCause::_last_ditch_collection);
221 // _result = _loader_data->metaspace_non_null()->allocate(_size, _mdtype);
222 // }
223 } else {
224 MetaspaceGC::set_should_concurrent_collect(true);
225 do_cms_concurrent = true;
226 }
227 if (_result == NULL) {
228 // If still failing, allow the Metaspace to expand. 228 // If still failing, allow the Metaspace to expand.
229 // See delta_capacity_until_GC() for explanation of the 229 // See delta_capacity_until_GC() for explanation of the
230 // amount of the expansion. 230 // amount of the expansion.
231 // This should work unless there really is no more space 231 // This should work unless there really is no more space
232 // or a MaxMetaspaceSize has been specified on the command line. 232 // or a MaxMetaspaceSize has been specified on the command line.
233 _result = 233 _result =
234 _loader_data->metaspace_non_null()->expand_and_allocate(_size, _mdtype); 234 _loader_data->metaspace_non_null()->expand_and_allocate(_size, _mdtype);
235 235
236 if (do_cms_concurrent && _result == NULL) { 236 }
237 // Rather than fail with a metaspace out-of-memory, do a full 237 if (Verbose && PrintGCDetails && _result == NULL) {
238 // GC for CMS. 238 gclog_or_tty->print_cr("\nAfter Metaspace GC failed to allocate size "
239 heap->collect_as_vm_thread(GCCause::_metadata_GC_threshold); 239 SIZE_FORMAT, _size);
240 _result = _loader_data->metaspace_non_null()->allocate(_size, _mdtype);
241 }
242 if (_result == NULL) {
243 if (PrintGCDetails) {
244 gclog_or_tty->print_cr("\nAfter Metaspace GC failed to allocate size "
245 SIZE_FORMAT, _size);
246 }
247 }
248 } 240 }
249 } 241 }
250 242
251 if (_result == NULL && GC_locker::is_active_and_needs_gc()) { 243 if (_result == NULL && GC_locker::is_active_and_needs_gc()) {
252 set_gc_locked(); 244 set_gc_locked();