src/share/vm/memory/genCollectedHeap.cpp

changeset 6992
2c6ef90f030a
parent 6978
30c99d8e0f02
child 7009
3f2894c5052e
     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) {

mercurial