2297 bool silent, |
2297 bool silent, |
2298 bool use_prev_marking) { |
2298 bool use_prev_marking) { |
2299 if (SafepointSynchronize::is_at_safepoint() || ! UseTLAB) { |
2299 if (SafepointSynchronize::is_at_safepoint() || ! UseTLAB) { |
2300 if (!silent) { gclog_or_tty->print("roots "); } |
2300 if (!silent) { gclog_or_tty->print("roots "); } |
2301 VerifyRootsClosure rootsCl(use_prev_marking); |
2301 VerifyRootsClosure rootsCl(use_prev_marking); |
2302 process_strong_roots(false, |
2302 CodeBlobToOopClosure blobsCl(&rootsCl, /*do_marking=*/ false); |
|
2303 process_strong_roots(true, // activate StrongRootsScope |
|
2304 false, |
2303 SharedHeap::SO_AllClasses, |
2305 SharedHeap::SO_AllClasses, |
2304 &rootsCl, |
2306 &rootsCl, |
|
2307 &blobsCl, |
2305 &rootsCl); |
2308 &rootsCl); |
2306 rem_set()->invalidate(perm_gen()->used_region(), false); |
2309 rem_set()->invalidate(perm_gen()->used_region(), false); |
2307 if (!silent) { gclog_or_tty->print("heapRegions "); } |
2310 if (!silent) { gclog_or_tty->print("heapRegions "); } |
2308 if (GCParallelVerificationEnabled && ParallelGCThreads > 1) { |
2311 if (GCParallelVerificationEnabled && ParallelGCThreads > 1) { |
2309 assert(check_heap_region_claim_values(HeapRegion::InitialClaimValue), |
2312 assert(check_heap_region_claim_values(HeapRegion::InitialClaimValue), |
3990 |
3993 |
3991 BufferingOopClosure buf_scan_non_heap_roots(scan_non_heap_roots); |
3994 BufferingOopClosure buf_scan_non_heap_roots(scan_non_heap_roots); |
3992 BufferingOopsInGenClosure buf_scan_perm(scan_perm); |
3995 BufferingOopsInGenClosure buf_scan_perm(scan_perm); |
3993 buf_scan_perm.set_generation(perm_gen()); |
3996 buf_scan_perm.set_generation(perm_gen()); |
3994 |
3997 |
3995 process_strong_roots(collecting_perm_gen, so, |
3998 // Walk the code cache w/o buffering, because StarTask cannot handle |
|
3999 // unaligned oop locations. |
|
4000 CodeBlobToOopClosure eager_scan_code_roots(scan_non_heap_roots, /*do_marking=*/ true); |
|
4001 |
|
4002 process_strong_roots(false, // no scoping; this is parallel code |
|
4003 collecting_perm_gen, so, |
3996 &buf_scan_non_heap_roots, |
4004 &buf_scan_non_heap_roots, |
|
4005 &eager_scan_code_roots, |
3997 &buf_scan_perm); |
4006 &buf_scan_perm); |
3998 // Finish up any enqueued closure apps. |
4007 // Finish up any enqueued closure apps. |
3999 buf_scan_non_heap_roots.done(); |
4008 buf_scan_non_heap_roots.done(); |
4000 buf_scan_perm.done(); |
4009 buf_scan_perm.done(); |
4001 double ext_roots_end = os::elapsedTime(); |
4010 double ext_roots_end = os::elapsedTime(); |
4081 } |
4090 } |
4082 |
4091 |
4083 void |
4092 void |
4084 G1CollectedHeap::g1_process_weak_roots(OopClosure* root_closure, |
4093 G1CollectedHeap::g1_process_weak_roots(OopClosure* root_closure, |
4085 OopClosure* non_root_closure) { |
4094 OopClosure* non_root_closure) { |
4086 SharedHeap::process_weak_roots(root_closure, non_root_closure); |
4095 CodeBlobToOopClosure roots_in_blobs(root_closure, /*do_marking=*/ false); |
|
4096 SharedHeap::process_weak_roots(root_closure, &roots_in_blobs, non_root_closure); |
4087 } |
4097 } |
4088 |
4098 |
4089 |
4099 |
4090 class SaveMarksClosure: public HeapRegionClosure { |
4100 class SaveMarksClosure: public HeapRegionClosure { |
4091 public: |
4101 public: |
4115 set_par_threads(n_workers); |
4125 set_par_threads(n_workers); |
4116 G1ParTask g1_par_task(this, n_workers, _task_queues); |
4126 G1ParTask g1_par_task(this, n_workers, _task_queues); |
4117 |
4127 |
4118 init_for_evac_failure(NULL); |
4128 init_for_evac_failure(NULL); |
4119 |
4129 |
4120 change_strong_roots_parity(); // In preparation for parallel strong roots. |
|
4121 rem_set()->prepare_for_younger_refs_iterate(true); |
4130 rem_set()->prepare_for_younger_refs_iterate(true); |
4122 |
4131 |
4123 assert(dirty_card_queue_set().completed_buffers_num() == 0, "Should be empty"); |
4132 assert(dirty_card_queue_set().completed_buffers_num() == 0, "Should be empty"); |
4124 double start_par = os::elapsedTime(); |
4133 double start_par = os::elapsedTime(); |
4125 if (ParallelGCThreads > 0) { |
4134 if (ParallelGCThreads > 0) { |
4126 // The individual threads will set their evac-failure closures. |
4135 // The individual threads will set their evac-failure closures. |
|
4136 StrongRootsScope srs(this); |
4127 workers()->run_task(&g1_par_task); |
4137 workers()->run_task(&g1_par_task); |
4128 } else { |
4138 } else { |
|
4139 StrongRootsScope srs(this); |
4129 g1_par_task.work(0); |
4140 g1_par_task.work(0); |
4130 } |
4141 } |
4131 |
4142 |
4132 double par_time = (os::elapsedTime() - start_par) * 1000.0; |
4143 double par_time = (os::elapsedTime() - start_par) * 1000.0; |
4133 g1_policy()->record_par_time(par_time); |
4144 g1_policy()->record_par_time(par_time); |