comparison src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp @ 4711:adedfbbf0360

7120038: G1: ParallelGCThreads==0 is broken Summary: Running G1 with ParallelGCThreads==0 results in various crashes and asserts. Most of these are caused by unguarded references to the worker threads array or an incorrect number of active workers. Reviewed-by: jmasa, tonyp
author johnc
date Fri, 16 Dec 2011 11:40:00 -0800
parents 41406797186b
children 441e946dc1af
comparison
equal deleted inserted replaced
4710:41406797186b 4711:adedfbbf0360
3785 } 3785 }
3786 3786
3787 double end_time_sec = os::elapsedTime(); 3787 double end_time_sec = os::elapsedTime();
3788 double pause_time_ms = (end_time_sec - start_time_sec) * MILLIUNITS; 3788 double pause_time_ms = (end_time_sec - start_time_sec) * MILLIUNITS;
3789 g1_policy()->record_pause_time_ms(pause_time_ms); 3789 g1_policy()->record_pause_time_ms(pause_time_ms);
3790 int active_gc_threads = workers()->active_workers(); 3790 int active_workers = (G1CollectedHeap::use_parallel_gc_threads() ?
3791 g1_policy()->record_collection_pause_end(active_gc_threads); 3791 workers()->active_workers() : 1);
3792 g1_policy()->record_collection_pause_end(active_workers);
3792 3793
3793 MemoryService::track_memory_usage(); 3794 MemoryService::track_memory_usage();
3794 3795
3795 // In prepare_for_verify() below we'll need to scan the deferred 3796 // In prepare_for_verify() below we'll need to scan the deferred
3796 // update buffers to bring the RSets up-to-date if 3797 // update buffers to bring the RSets up-to-date if
5310 // object discovered by the STW ref processor. 5311 // object discovered by the STW ref processor.
5311 5312
5312 int active_workers = (G1CollectedHeap::use_parallel_gc_threads() ? 5313 int active_workers = (G1CollectedHeap::use_parallel_gc_threads() ?
5313 workers()->active_workers() : 1); 5314 workers()->active_workers() : 1);
5314 5315
5315 assert(active_workers == workers()->active_workers(), 5316 assert(!G1CollectedHeap::use_parallel_gc_threads() ||
5316 "Need to reset active_workers"); 5317 active_workers == workers()->active_workers(),
5318 "Need to reset active_workers");
5319
5317 set_par_threads(active_workers); 5320 set_par_threads(active_workers);
5318 G1ParPreserveCMReferentsTask keep_cm_referents(this, active_workers, _task_queues); 5321 G1ParPreserveCMReferentsTask keep_cm_referents(this, active_workers, _task_queues);
5319 5322
5320 if (G1CollectedHeap::use_parallel_gc_threads()) { 5323 if (G1CollectedHeap::use_parallel_gc_threads()) {
5321 workers()->run_task(&keep_cm_referents); 5324 workers()->run_task(&keep_cm_referents);
5449 workers()->active_workers(), 5452 workers()->active_workers(),
5450 Threads::number_of_non_daemon_threads()); 5453 Threads::number_of_non_daemon_threads());
5451 assert(UseDynamicNumberOfGCThreads || 5454 assert(UseDynamicNumberOfGCThreads ||
5452 n_workers == workers()->total_workers(), 5455 n_workers == workers()->total_workers(),
5453 "If not dynamic should be using all the workers"); 5456 "If not dynamic should be using all the workers");
5457 workers()->set_active_workers(n_workers);
5454 set_par_threads(n_workers); 5458 set_par_threads(n_workers);
5455 } else { 5459 } else {
5456 assert(n_par_threads() == 0, 5460 assert(n_par_threads() == 0,
5457 "Should be the original non-parallel value"); 5461 "Should be the original non-parallel value");
5458 n_workers = 1; 5462 n_workers = 1;
5459 } 5463 }
5460 workers()->set_active_workers(n_workers);
5461 5464
5462 G1ParTask g1_par_task(this, _task_queues); 5465 G1ParTask g1_par_task(this, _task_queues);
5463 5466
5464 init_for_evac_failure(NULL); 5467 init_for_evac_failure(NULL);
5465 5468
5477 workers()->active_workers() == workers()->total_workers(), 5480 workers()->active_workers() == workers()->total_workers(),
5478 "If not dynamic should be using all the workers"); 5481 "If not dynamic should be using all the workers");
5479 workers()->run_task(&g1_par_task); 5482 workers()->run_task(&g1_par_task);
5480 } else { 5483 } else {
5481 StrongRootsScope srs(this); 5484 StrongRootsScope srs(this);
5485 g1_par_task.set_for_termination(n_workers);
5482 g1_par_task.work(0); 5486 g1_par_task.work(0);
5483 } 5487 }
5484 5488
5485 double par_time = (os::elapsedTime() - start_par) * 1000.0; 5489 double par_time = (os::elapsedTime() - start_par) * 1000.0;
5486 g1_policy()->record_par_time(par_time); 5490 g1_policy()->record_par_time(par_time);
5725 5729
5726 { 5730 {
5727 // Iterate over the dirty cards region list. 5731 // Iterate over the dirty cards region list.
5728 G1ParCleanupCTTask cleanup_task(ct_bs, this); 5732 G1ParCleanupCTTask cleanup_task(ct_bs, this);
5729 5733
5730 if (ParallelGCThreads > 0) { 5734 if (G1CollectedHeap::use_parallel_gc_threads()) {
5731 set_par_threads(workers()->total_workers()); 5735 set_par_threads();
5732 workers()->run_task(&cleanup_task); 5736 workers()->run_task(&cleanup_task);
5733 set_par_threads(0); 5737 set_par_threads(0);
5734 } else { 5738 } else {
5735 while (_dirty_cards_region_list) { 5739 while (_dirty_cards_region_list) {
5736 HeapRegion* r = _dirty_cards_region_list; 5740 HeapRegion* r = _dirty_cards_region_list;
6134 } 6138 }
6135 6139
6136 void G1CollectedHeap::set_par_threads() { 6140 void G1CollectedHeap::set_par_threads() {
6137 // Don't change the number of workers. Use the value previously set 6141 // Don't change the number of workers. Use the value previously set
6138 // in the workgroup. 6142 // in the workgroup.
6143 assert(G1CollectedHeap::use_parallel_gc_threads(), "shouldn't be here otherwise");
6139 int n_workers = workers()->active_workers(); 6144 int n_workers = workers()->active_workers();
6140 assert(UseDynamicNumberOfGCThreads || 6145 assert(UseDynamicNumberOfGCThreads ||
6141 n_workers == workers()->total_workers(), 6146 n_workers == workers()->total_workers(),
6142 "Otherwise should be using the total number of workers"); 6147 "Otherwise should be using the total number of workers");
6143 if (n_workers == 0) { 6148 if (n_workers == 0) {
6144 assert(false, "Should have been set in prior evacuation pause."); 6149 assert(false, "Should have been set in prior evacuation pause.");
6145 n_workers = ParallelGCThreads; 6150 n_workers = ParallelGCThreads;