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);
|