bool ClassLoaderData::is_alive(BoolObjectClosure* is_alive_closure) const { bool alive = keep_alive() // null class loader and incomplete anonymous klasses. || is_alive_closure->do_object_b(keep_alive_object()); #ifdef ASSERT if (alive) { AllAliveClosure all_alive_closure(is_alive_closure); KlassToOopClosure klass_closure(&all_alive_closure); const_cast<ClassLoaderData*>(this)->oops_do(&all_alive_closure, &klass_closure, false); assert(!all_alive_closure.found_dead(), err_msg("Found dead oop in alive cld: " PTR_FORMAT, p2i(this))); } #endif return alive; }
void ScavengeRootsTask::do_it(GCTaskManager* manager, uint which) { assert(ParallelScavengeHeap::heap()->is_gc_active(), "called outside gc"); PSPromotionManager* pm = PSPromotionManager::gc_thread_promotion_manager(which); PSScavengeRootsClosure roots_closure(pm); PSPromoteRootsClosure roots_to_old_closure(pm); switch (_root_type) { case universe: Universe::oops_do(&roots_closure); break; case jni_handles: JNIHandles::oops_do(&roots_closure); break; case threads: { ResourceMark rm; CLDClosure* cld_closure = NULL; // Not needed. All CLDs are already visited. Threads::oops_do(&roots_closure, cld_closure, NULL); } break; case object_synchronizer: ObjectSynchronizer::oops_do(&roots_closure); break; case flat_profiler: FlatProfiler::oops_do(&roots_closure); break; case system_dictionary: SystemDictionary::oops_do(&roots_closure); break; case class_loader_data: { PSScavengeKlassClosure klass_closure(pm); ClassLoaderDataGraph::oops_do(&roots_closure, &klass_closure, false); } break; case management: Management::oops_do(&roots_closure); break; case jvmti: JvmtiExport::oops_do(&roots_closure); break; case code_cache: { MarkingCodeBlobClosure each_scavengable_code_blob(&roots_to_old_closure, CodeBlobToOopClosure::FixRelocations); CodeCache::scavenge_root_nmethods_do(&each_scavengable_code_blob); } break; default: fatal("Unknown root type"); } // Do the real work pm->drain_stacks(false); }