src/share/vm/memory/genCollectedHeap.cpp

Print this page

        

*** 59,84 **** #endif // INCLUDE_ALL_GCS GenCollectedHeap* GenCollectedHeap::_gch; NOT_PRODUCT(size_t GenCollectedHeap::_skip_header_HeapWords = 0;) ! // The set of potentially parallel tasks in strong root scanning. ! enum GCH_process_strong_roots_tasks { // We probably want to parallelize both of these internally, but for now... GCH_PS_younger_gens, // Leave this one last. GCH_PS_NumElements }; GenCollectedHeap::GenCollectedHeap(GenCollectorPolicy *policy) : SharedHeap(policy), _gen_policy(policy), ! _gen_process_strong_tasks(new SubTasksDone(GCH_PS_NumElements)), _full_collections_completed(0) { ! if (_gen_process_strong_tasks == NULL || ! !_gen_process_strong_tasks->valid()) { vm_exit_during_initialization("Failed necessary allocation."); } assert(policy != NULL, "Sanity check"); } --- 59,84 ---- #endif // INCLUDE_ALL_GCS GenCollectedHeap* GenCollectedHeap::_gch; NOT_PRODUCT(size_t GenCollectedHeap::_skip_header_HeapWords = 0;) ! // The set of potentially parallel tasks in root scanning. ! enum GCH_strong_roots_tasks { // We probably want to parallelize both of these internally, but for now... GCH_PS_younger_gens, // Leave this one last. GCH_PS_NumElements }; GenCollectedHeap::GenCollectedHeap(GenCollectorPolicy *policy) : SharedHeap(policy), _gen_policy(policy), ! _gen_process_roots_tasks(new SubTasksDone(GCH_PS_NumElements)), _full_collections_completed(0) { ! if (_gen_process_roots_tasks == NULL || ! !_gen_process_roots_tasks->valid()) { vm_exit_during_initialization("Failed necessary allocation."); } assert(policy != NULL, "Sanity check"); }
*** 582,609 **** return collector_policy()->satisfy_failed_allocation(size, is_tlab); } void GenCollectedHeap::set_par_threads(uint t) { SharedHeap::set_par_threads(t); ! _gen_process_strong_tasks->set_n_threads(t); } void GenCollectedHeap:: ! gen_process_strong_roots(int level, bool younger_gens_as_roots, bool activate_scope, SharedHeap::ScanningOption so, OopsInGenClosure* not_older_gens, OopsInGenClosure* older_gens, ! KlassClosure* klass_closure) { ! // General strong roots. ! ! SharedHeap::process_strong_roots(activate_scope, so, ! not_older_gens, klass_closure); if (younger_gens_as_roots) { ! if (!_gen_process_strong_tasks->is_task_claimed(GCH_PS_younger_gens)) { for (int i = 0; i < level; i++) { not_older_gens->set_generation(_gens[i]); _gens[i]->oop_iterate(not_older_gens); } not_older_gens->reset_generation(); --- 582,614 ---- return collector_policy()->satisfy_failed_allocation(size, is_tlab); } void GenCollectedHeap::set_par_threads(uint t) { SharedHeap::set_par_threads(t); ! _gen_process_roots_tasks->set_n_threads(t); } void GenCollectedHeap:: ! gen_process_roots(int level, bool younger_gens_as_roots, bool activate_scope, SharedHeap::ScanningOption so, OopsInGenClosure* not_older_gens, + OopsInGenClosure* weak_roots, OopsInGenClosure* older_gens, ! CLDClosure* cld_closure, ! CLDClosure* weak_cld_closure, ! CodeBlobClosure* code_closure) { ! ! // General roots. ! SharedHeap::process_roots(activate_scope, so, ! not_older_gens, weak_roots, ! cld_closure, weak_cld_closure, ! code_closure); if (younger_gens_as_roots) { ! if (!_gen_process_roots_tasks->is_task_claimed(GCH_PS_younger_gens)) { for (int i = 0; i < level; i++) { not_older_gens->set_generation(_gens[i]); _gens[i]->oop_iterate(not_older_gens); } not_older_gens->reset_generation();
*** 615,625 **** older_gens->set_generation(_gens[i]); rem_set()->younger_refs_iterate(_gens[i], older_gens); older_gens->reset_generation(); } ! _gen_process_strong_tasks->all_tasks_completed(); } void GenCollectedHeap::gen_process_weak_roots(OopClosure* root_closure) { SharedHeap::process_weak_roots(root_closure); // "Local" "weak" refs --- 620,661 ---- older_gens->set_generation(_gens[i]); rem_set()->younger_refs_iterate(_gens[i], older_gens); older_gens->reset_generation(); } ! _gen_process_roots_tasks->all_tasks_completed(); ! } ! ! void GenCollectedHeap:: ! gen_process_roots(int level, ! bool younger_gens_as_roots, ! bool activate_scope, ! SharedHeap::ScanningOption so, ! bool only_strong_roots, ! OopsInGenClosure* not_older_gens, ! OopsInGenClosure* older_gens, ! CLDClosure* cld_closure) { ! ! const bool is_adjust_phase = !only_strong_roots && !younger_gens_as_roots; ! ! bool is_moving_collection = false; ! if (level == 0 || is_adjust_phase) { ! // young collections are always moving ! is_moving_collection = true; ! } ! ! MarkingCodeBlobClosure mark_code_closure(not_older_gens, is_moving_collection); ! CodeBlobClosure* code_closure = &mark_code_closure; ! ! gen_process_roots(level, ! younger_gens_as_roots, ! activate_scope, so, ! not_older_gens, only_strong_roots ? NULL : not_older_gens, ! older_gens, ! cld_closure, only_strong_roots ? NULL : cld_closure, ! code_closure); ! } void GenCollectedHeap::gen_process_weak_roots(OopClosure* root_closure) { SharedHeap::process_weak_roots(root_closure); // "Local" "weak" refs