comparison src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp @ 4023:c6a6e936dc68

7096030: G1: PrintGCDetails enhancements 7102445: G1: Unnecessary Resource allocations during RSet scanning Summary: Add a new per-worker thread line in the PrintGCDetails output. GC Worker Other is the difference between the elapsed time for the parallel phase of the evacuation pause and the sum of the times of the sub-phases (external root scanning, mark stack scanning, RSet updating, RSet scanning, object copying, and termination) for that worker. During RSet scanning, stack allocate DirtyCardToOopClosure objects; allocating these in a resource area was causing abnormally high GC Worker Other times while the worker thread freed ResourceArea chunks. Reviewed-by: tonyp, jwilhelm, brutisso
author johnc
date Sun, 23 Oct 2011 23:06:06 -0700
parents bf2d2b8b1726
children 8aae2050e83e
comparison
equal deleted inserted replaced
4022:db89aa49298f 4023:c6a6e936dc68
5500 5500
5501 void G1CollectedHeap::cleanUpCardTable() { 5501 void G1CollectedHeap::cleanUpCardTable() {
5502 CardTableModRefBS* ct_bs = (CardTableModRefBS*) (barrier_set()); 5502 CardTableModRefBS* ct_bs = (CardTableModRefBS*) (barrier_set());
5503 double start = os::elapsedTime(); 5503 double start = os::elapsedTime();
5504 5504
5505 // Iterate over the dirty cards region list. 5505 {
5506 G1ParCleanupCTTask cleanup_task(ct_bs, this); 5506 // Iterate over the dirty cards region list.
5507 5507 G1ParCleanupCTTask cleanup_task(ct_bs, this);
5508 if (ParallelGCThreads > 0) { 5508
5509 set_par_threads(workers()->total_workers()); 5509 if (ParallelGCThreads > 0) {
5510 workers()->run_task(&cleanup_task); 5510 set_par_threads(workers()->total_workers());
5511 set_par_threads(0); 5511 workers()->run_task(&cleanup_task);
5512 } else { 5512 set_par_threads(0);
5513 while (_dirty_cards_region_list) { 5513 } else {
5514 HeapRegion* r = _dirty_cards_region_list; 5514 while (_dirty_cards_region_list) {
5515 cleanup_task.clear_cards(r); 5515 HeapRegion* r = _dirty_cards_region_list;
5516 _dirty_cards_region_list = r->get_next_dirty_cards_region(); 5516 cleanup_task.clear_cards(r);
5517 if (_dirty_cards_region_list == r) { 5517 _dirty_cards_region_list = r->get_next_dirty_cards_region();
5518 // The last region. 5518 if (_dirty_cards_region_list == r) {
5519 _dirty_cards_region_list = NULL; 5519 // The last region.
5520 _dirty_cards_region_list = NULL;
5521 }
5522 r->set_next_dirty_cards_region(NULL);
5520 } 5523 }
5521 r->set_next_dirty_cards_region(NULL); 5524 }
5522 } 5525 #ifndef PRODUCT
5526 if (G1VerifyCTCleanup || VerifyAfterGC) {
5527 G1VerifyCardTableCleanup cleanup_verifier(this, ct_bs);
5528 heap_region_iterate(&cleanup_verifier);
5529 }
5530 #endif
5523 } 5531 }
5524 5532
5525 double elapsed = os::elapsedTime() - start; 5533 double elapsed = os::elapsedTime() - start;
5526 g1_policy()->record_clear_ct_time(elapsed * 1000.0); 5534 g1_policy()->record_clear_ct_time(elapsed * 1000.0);
5527 #ifndef PRODUCT
5528 if (G1VerifyCTCleanup || VerifyAfterGC) {
5529 G1VerifyCardTableCleanup cleanup_verifier(this, ct_bs);
5530 heap_region_iterate(&cleanup_verifier);
5531 }
5532 #endif
5533 } 5535 }
5534 5536
5535 void G1CollectedHeap::free_collection_set(HeapRegion* cs_head) { 5537 void G1CollectedHeap::free_collection_set(HeapRegion* cs_head) {
5536 size_t pre_used = 0; 5538 size_t pre_used = 0;
5537 FreeRegionList local_free_list("Local List for CSet Freeing"); 5539 FreeRegionList local_free_list("Local List for CSet Freeing");