1.1 --- a/src/share/vm/memory/genCollectedHeap.cpp Tue Jul 01 09:03:55 2014 +0200 1.2 +++ b/src/share/vm/memory/genCollectedHeap.cpp Mon Jul 07 10:12:40 2014 +0200 1.3 @@ -61,8 +61,8 @@ 1.4 GenCollectedHeap* GenCollectedHeap::_gch; 1.5 NOT_PRODUCT(size_t GenCollectedHeap::_skip_header_HeapWords = 0;) 1.6 1.7 -// The set of potentially parallel tasks in strong root scanning. 1.8 -enum GCH_process_strong_roots_tasks { 1.9 +// The set of potentially parallel tasks in root scanning. 1.10 +enum GCH_strong_roots_tasks { 1.11 // We probably want to parallelize both of these internally, but for now... 1.12 GCH_PS_younger_gens, 1.13 // Leave this one last. 1.14 @@ -72,11 +72,11 @@ 1.15 GenCollectedHeap::GenCollectedHeap(GenCollectorPolicy *policy) : 1.16 SharedHeap(policy), 1.17 _gen_policy(policy), 1.18 - _gen_process_strong_tasks(new SubTasksDone(GCH_PS_NumElements)), 1.19 + _gen_process_roots_tasks(new SubTasksDone(GCH_PS_NumElements)), 1.20 _full_collections_completed(0) 1.21 { 1.22 - if (_gen_process_strong_tasks == NULL || 1.23 - !_gen_process_strong_tasks->valid()) { 1.24 + if (_gen_process_roots_tasks == NULL || 1.25 + !_gen_process_roots_tasks->valid()) { 1.26 vm_exit_during_initialization("Failed necessary allocation."); 1.27 } 1.28 assert(policy != NULL, "Sanity check"); 1.29 @@ -590,24 +590,29 @@ 1.30 1.31 void GenCollectedHeap::set_par_threads(uint t) { 1.32 SharedHeap::set_par_threads(t); 1.33 - _gen_process_strong_tasks->set_n_threads(t); 1.34 + _gen_process_roots_tasks->set_n_threads(t); 1.35 } 1.36 1.37 void GenCollectedHeap:: 1.38 -gen_process_strong_roots(int level, 1.39 - bool younger_gens_as_roots, 1.40 - bool activate_scope, 1.41 - SharedHeap::ScanningOption so, 1.42 - OopsInGenClosure* not_older_gens, 1.43 - OopsInGenClosure* older_gens, 1.44 - KlassClosure* klass_closure) { 1.45 - // General strong roots. 1.46 +gen_process_roots(int level, 1.47 + bool younger_gens_as_roots, 1.48 + bool activate_scope, 1.49 + SharedHeap::ScanningOption so, 1.50 + OopsInGenClosure* not_older_gens, 1.51 + OopsInGenClosure* weak_roots, 1.52 + OopsInGenClosure* older_gens, 1.53 + CLDClosure* cld_closure, 1.54 + CLDClosure* weak_cld_closure, 1.55 + CodeBlobClosure* code_closure) { 1.56 1.57 - SharedHeap::process_strong_roots(activate_scope, so, 1.58 - not_older_gens, klass_closure); 1.59 + // General roots. 1.60 + SharedHeap::process_roots(activate_scope, so, 1.61 + not_older_gens, weak_roots, 1.62 + cld_closure, weak_cld_closure, 1.63 + code_closure); 1.64 1.65 if (younger_gens_as_roots) { 1.66 - if (!_gen_process_strong_tasks->is_task_claimed(GCH_PS_younger_gens)) { 1.67 + if (!_gen_process_roots_tasks->is_task_claimed(GCH_PS_younger_gens)) { 1.68 for (int i = 0; i < level; i++) { 1.69 not_older_gens->set_generation(_gens[i]); 1.70 _gens[i]->oop_iterate(not_older_gens); 1.71 @@ -623,7 +628,38 @@ 1.72 older_gens->reset_generation(); 1.73 } 1.74 1.75 - _gen_process_strong_tasks->all_tasks_completed(); 1.76 + _gen_process_roots_tasks->all_tasks_completed(); 1.77 +} 1.78 + 1.79 +void GenCollectedHeap:: 1.80 +gen_process_roots(int level, 1.81 + bool younger_gens_as_roots, 1.82 + bool activate_scope, 1.83 + SharedHeap::ScanningOption so, 1.84 + bool only_strong_roots, 1.85 + OopsInGenClosure* not_older_gens, 1.86 + OopsInGenClosure* older_gens, 1.87 + CLDClosure* cld_closure) { 1.88 + 1.89 + const bool is_adjust_phase = !only_strong_roots && !younger_gens_as_roots; 1.90 + 1.91 + bool is_moving_collection = false; 1.92 + if (level == 0 || is_adjust_phase) { 1.93 + // young collections are always moving 1.94 + is_moving_collection = true; 1.95 + } 1.96 + 1.97 + MarkingCodeBlobClosure mark_code_closure(not_older_gens, is_moving_collection); 1.98 + CodeBlobClosure* code_closure = &mark_code_closure; 1.99 + 1.100 + gen_process_roots(level, 1.101 + younger_gens_as_roots, 1.102 + activate_scope, so, 1.103 + not_older_gens, only_strong_roots ? NULL : not_older_gens, 1.104 + older_gens, 1.105 + cld_closure, only_strong_roots ? NULL : cld_closure, 1.106 + code_closure); 1.107 + 1.108 } 1.109 1.110 void GenCollectedHeap::gen_process_weak_roots(OopClosure* root_closure) {