< prev index next >

src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp

Print this page
rev 7854 : imported patch 8027962-per-phase-timing-measurements-for-strong-roots-processing
rev 7855 : [mq]: 8027962-bengt-suggestions


4553         strong_code_cl = &scan_mark_code_cl;
4554         if (ClassUnloadingWithConcurrentMark) {
4555           weak_root_cl = &scan_mark_weak_root_cl;
4556           weak_cld_cl  = &scan_mark_weak_cld_cl;
4557         } else {
4558           weak_root_cl = &scan_mark_root_cl;
4559           weak_cld_cl  = &scan_mark_cld_cl;
4560         }
4561       } else {
4562         strong_root_cl = &scan_only_root_cl;
4563         weak_root_cl   = &scan_only_root_cl;
4564         strong_cld_cl  = &scan_only_cld_cl;
4565         weak_cld_cl    = &scan_only_cld_cl;
4566         strong_code_cl = &scan_only_code_cl;
4567       }
4568 
4569 
4570       G1ParPushHeapRSClosure  push_heap_rs_cl(_g1h, &pss);
4571 
4572       G1GCPhaseTimes* pt = _g1h->g1_policy()->phase_times();
4573       GCPhaseTimeTracker phase_tracker(pt->get_ext_root_scan_phase_times(), pt->num_ext_root_scan_phases(), worker_id);
4574 
4575       pss.start_strong_roots();
4576       _g1h->g1_process_roots(strong_root_cl,
4577                              weak_root_cl,
4578                              &push_heap_rs_cl,
4579                              strong_cld_cl,
4580                              weak_cld_cl,
4581                              strong_code_cl,
4582                              worker_id,
4583                              &phase_tracker);
4584 
4585       pss.end_strong_roots();
4586 
4587       {
4588         double start = os::elapsedTime();
4589         G1ParEvacuateFollowersClosure evac(_g1h, &pss, _queues, &_terminator);
4590         evac.do_void();
4591         double elapsed_ms = (os::elapsedTime()-start)*1000.0;
4592         double term_ms = pss.term_time()*1000.0;
4593         _g1h->g1_policy()->phase_times()->add_obj_copy_time(worker_id, elapsed_ms-term_ms);


4609     }
4610 
4611     double end_time_ms = os::elapsedTime() * 1000.0;
4612     _g1h->g1_policy()->phase_times()->record_gc_worker_end_time(worker_id, end_time_ms);
4613   }
4614 };
4615 
4616 // *** Common G1 Evacuation Stuff
4617 
4618 // This method is run in a GC worker.
4619 
4620 void
4621 G1CollectedHeap::
4622 g1_process_roots(OopClosure* scan_non_heap_roots,
4623                  OopClosure* scan_non_heap_weak_roots,
4624                  G1ParPushHeapRSClosure* scan_rs,
4625                  CLDClosure* scan_strong_clds,
4626                  CLDClosure* scan_weak_clds,
4627                  CodeBlobClosure* scan_strong_code,
4628                  uint worker_i,
4629                  GCPhaseTimeTracker* phase_tracker) {
4630 
4631   // First scan the shared roots.
4632   double ext_roots_start = os::elapsedTime();
4633   double closure_app_time_sec = 0.0;
4634 
4635   bool during_im = _g1h->g1_policy()->during_initial_mark_pause();
4636   bool trace_metadata = during_im && ClassUnloadingWithConcurrentMark;
4637 
4638   BufferingOopClosure buf_scan_non_heap_roots(scan_non_heap_roots);
4639   BufferingOopClosure buf_scan_non_heap_weak_roots(scan_non_heap_weak_roots);
4640 
4641   process_roots(false, // no scoping; this is parallel code
4642                 SharedHeap::SO_None,
4643                 &buf_scan_non_heap_roots,
4644                 &buf_scan_non_heap_weak_roots,
4645                 scan_strong_clds,
4646                 // Unloading Initial Marks handle the weak CLDs separately.
4647                 (trace_metadata ? NULL : scan_weak_clds),
4648                 scan_strong_code,
4649                 phase_tracker);




4553         strong_code_cl = &scan_mark_code_cl;
4554         if (ClassUnloadingWithConcurrentMark) {
4555           weak_root_cl = &scan_mark_weak_root_cl;
4556           weak_cld_cl  = &scan_mark_weak_cld_cl;
4557         } else {
4558           weak_root_cl = &scan_mark_root_cl;
4559           weak_cld_cl  = &scan_mark_cld_cl;
4560         }
4561       } else {
4562         strong_root_cl = &scan_only_root_cl;
4563         weak_root_cl   = &scan_only_root_cl;
4564         strong_cld_cl  = &scan_only_cld_cl;
4565         weak_cld_cl    = &scan_only_cld_cl;
4566         strong_code_cl = &scan_only_code_cl;
4567       }
4568 
4569 
4570       G1ParPushHeapRSClosure  push_heap_rs_cl(_g1h, &pss);
4571 
4572       G1GCPhaseTimes* pt = _g1h->g1_policy()->phase_times();
4573       GCPhaseTimeData phase_tracker(pt->get_ext_root_scan_phase_times(), pt->num_ext_root_scan_phases(), worker_id);
4574 
4575       pss.start_strong_roots();
4576       _g1h->g1_process_roots(strong_root_cl,
4577                              weak_root_cl,
4578                              &push_heap_rs_cl,
4579                              strong_cld_cl,
4580                              weak_cld_cl,
4581                              strong_code_cl,
4582                              worker_id,
4583                              &phase_tracker);
4584 
4585       pss.end_strong_roots();
4586 
4587       {
4588         double start = os::elapsedTime();
4589         G1ParEvacuateFollowersClosure evac(_g1h, &pss, _queues, &_terminator);
4590         evac.do_void();
4591         double elapsed_ms = (os::elapsedTime()-start)*1000.0;
4592         double term_ms = pss.term_time()*1000.0;
4593         _g1h->g1_policy()->phase_times()->add_obj_copy_time(worker_id, elapsed_ms-term_ms);


4609     }
4610 
4611     double end_time_ms = os::elapsedTime() * 1000.0;
4612     _g1h->g1_policy()->phase_times()->record_gc_worker_end_time(worker_id, end_time_ms);
4613   }
4614 };
4615 
4616 // *** Common G1 Evacuation Stuff
4617 
4618 // This method is run in a GC worker.
4619 
4620 void
4621 G1CollectedHeap::
4622 g1_process_roots(OopClosure* scan_non_heap_roots,
4623                  OopClosure* scan_non_heap_weak_roots,
4624                  G1ParPushHeapRSClosure* scan_rs,
4625                  CLDClosure* scan_strong_clds,
4626                  CLDClosure* scan_weak_clds,
4627                  CodeBlobClosure* scan_strong_code,
4628                  uint worker_i,
4629                  PhaseTimeData* phase_tracker) {
4630 
4631   // First scan the shared roots.
4632   double ext_roots_start = os::elapsedTime();
4633   double closure_app_time_sec = 0.0;
4634 
4635   bool during_im = _g1h->g1_policy()->during_initial_mark_pause();
4636   bool trace_metadata = during_im && ClassUnloadingWithConcurrentMark;
4637 
4638   BufferingOopClosure buf_scan_non_heap_roots(scan_non_heap_roots);
4639   BufferingOopClosure buf_scan_non_heap_weak_roots(scan_non_heap_weak_roots);
4640 
4641   process_roots(false, // no scoping; this is parallel code
4642                 SharedHeap::SO_None,
4643                 &buf_scan_non_heap_roots,
4644                 &buf_scan_non_heap_weak_roots,
4645                 scan_strong_clds,
4646                 // Unloading Initial Marks handle the weak CLDs separately.
4647                 (trace_metadata ? NULL : scan_weak_clds),
4648                 scan_strong_code,
4649                 phase_tracker);


< prev index next >