1 /* |
1 /* |
2 * Copyright 2000-2009 Sun Microsystems, Inc. All Rights Reserved. |
2 * Copyright 2000-2010 Sun Microsystems, Inc. All Rights Reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * |
4 * |
5 * This code is free software; you can redistribute it and/or modify it |
5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as |
6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. |
7 * published by the Free Software Foundation. |
426 |
426 |
427 assert(SafepointSynchronize::is_at_safepoint(), "should be at safepoint"); |
427 assert(SafepointSynchronize::is_at_safepoint(), "should be at safepoint"); |
428 assert(my_thread->is_VM_thread() || |
428 assert(my_thread->is_VM_thread() || |
429 my_thread->is_ConcurrentGC_thread(), |
429 my_thread->is_ConcurrentGC_thread(), |
430 "incorrect thread type capability"); |
430 "incorrect thread type capability"); |
431 assert(Heap_lock->is_locked(), "the requesting thread should have the Heap_lock"); |
431 assert(Heap_lock->is_locked(), |
|
432 "the requesting thread should have the Heap_lock"); |
432 guarantee(!is_gc_active(), "collection is not reentrant"); |
433 guarantee(!is_gc_active(), "collection is not reentrant"); |
433 assert(max_level < n_gens(), "sanity check"); |
434 assert(max_level < n_gens(), "sanity check"); |
434 |
435 |
435 if (GC_locker::check_active_before_gc()) { |
436 if (GC_locker::check_active_before_gc()) { |
436 return; // GC is disabled (e.g. JNI GetXXXCritical operation) |
437 return; // GC is disabled (e.g. JNI GetXXXCritical operation) |
437 } |
438 } |
|
439 |
|
440 const bool do_clear_all_soft_refs = clear_all_soft_refs || |
|
441 collector_policy()->should_clear_all_soft_refs(); |
|
442 |
|
443 ClearedAllSoftRefs casr(do_clear_all_soft_refs, collector_policy()); |
438 |
444 |
439 const size_t perm_prev_used = perm_gen()->used(); |
445 const size_t perm_prev_used = perm_gen()->used(); |
440 |
446 |
441 if (PrintHeapAtGC) { |
447 if (PrintHeapAtGC) { |
442 Universe::print_heap_before_gc(); |
448 Universe::print_heap_before_gc(); |
558 // atomic wrt other collectors in this configuration, we |
564 // atomic wrt other collectors in this configuration, we |
559 // are guaranteed to have empty discovered ref lists. |
565 // are guaranteed to have empty discovered ref lists. |
560 if (rp->discovery_is_atomic()) { |
566 if (rp->discovery_is_atomic()) { |
561 rp->verify_no_references_recorded(); |
567 rp->verify_no_references_recorded(); |
562 rp->enable_discovery(); |
568 rp->enable_discovery(); |
563 rp->setup_policy(clear_all_soft_refs); |
569 rp->setup_policy(do_clear_all_soft_refs); |
564 } else { |
570 } else { |
565 // collect() below will enable discovery as appropriate |
571 // collect() below will enable discovery as appropriate |
566 } |
572 } |
567 _gens[i]->collect(full, clear_all_soft_refs, size, is_tlab); |
573 _gens[i]->collect(full, do_clear_all_soft_refs, size, is_tlab); |
568 if (!rp->enqueuing_is_done()) { |
574 if (!rp->enqueuing_is_done()) { |
569 rp->enqueue_discovered_references(); |
575 rp->enqueue_discovered_references(); |
570 } else { |
576 } else { |
571 rp->set_enqueuing_is_done(false); |
577 rp->set_enqueuing_is_done(false); |
572 } |
578 } |