hotspot/src/share/vm/memory/genCollectedHeap.cpp
changeset 5343 95a5c4b89273
parent 4641 02adf6837856
child 5433 c182d4c3039e
equal deleted inserted replaced
5245:431efce7a0af 5343:95a5c4b89273
     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           }