comparison src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp @ 679:cea947c8a988

6819891: ParNew: Fix work queue overflow code to deal correctly with +UseCompressedOops Summary: When using compressed oops, rather than chaining the overflowed grey objects' pre-images through their klass words, we use GC-worker thread-local overflow stacks. Reviewed-by: jcoomes, jmasa
author ysr
date Sat, 28 Mar 2009 15:47:29 -0700
parents 7bb995fbd3c0
children fe1574da39fc
comparison
equal deleted inserted replaced
678:4ac7d97e6101 679:cea947c8a988
3845 } 3845 }
3846 assert(work_q->size() == 0, "Shouldn't steal"); 3846 assert(work_q->size() == 0, "Shouldn't steal");
3847 MutexLockerEx ml(ovflw_stk->par_lock(), 3847 MutexLockerEx ml(ovflw_stk->par_lock(),
3848 Mutex::_no_safepoint_check_flag); 3848 Mutex::_no_safepoint_check_flag);
3849 // Grab up to 1/4 the size of the work queue 3849 // Grab up to 1/4 the size of the work queue
3850 size_t num = MIN2((size_t)work_q->max_elems()/4, 3850 size_t num = MIN2((size_t)(work_q->max_elems() - work_q->size())/4,
3851 (size_t)ParGCDesiredObjsFromOverflowList); 3851 (size_t)ParGCDesiredObjsFromOverflowList);
3852 num = MIN2(num, ovflw_stk->length()); 3852 num = MIN2(num, ovflw_stk->length());
3853 for (int i = (int) num; i > 0; i--) { 3853 for (int i = (int) num; i > 0; i--) {
3854 oop cur = ovflw_stk->pop(); 3854 oop cur = ovflw_stk->pop();
3855 assert(cur != NULL, "Counted wrong?"); 3855 assert(cur != NULL, "Counted wrong?");
5202 int* seed) { 5202 int* seed) {
5203 OopTaskQueue* work_q = work_queue(i); 5203 OopTaskQueue* work_q = work_queue(i);
5204 NOT_PRODUCT(int num_steals = 0;) 5204 NOT_PRODUCT(int num_steals = 0;)
5205 oop obj_to_scan; 5205 oop obj_to_scan;
5206 CMSBitMap* bm = &(_collector->_markBitMap); 5206 CMSBitMap* bm = &(_collector->_markBitMap);
5207 size_t num_from_overflow_list =
5208 MIN2((size_t)work_q->max_elems()/4,
5209 (size_t)ParGCDesiredObjsFromOverflowList);
5210 5207
5211 while (true) { 5208 while (true) {
5212 // Completely finish any left over work from (an) earlier round(s) 5209 // Completely finish any left over work from (an) earlier round(s)
5213 cl->trim_queue(0); 5210 cl->trim_queue(0);
5211 size_t num_from_overflow_list = MIN2((size_t)(work_q->max_elems() - work_q->size())/4,
5212 (size_t)ParGCDesiredObjsFromOverflowList);
5214 // Now check if there's any work in the overflow list 5213 // Now check if there's any work in the overflow list
5215 if (_collector->par_take_from_overflow_list(num_from_overflow_list, 5214 if (_collector->par_take_from_overflow_list(num_from_overflow_list,
5216 work_q)) { 5215 work_q)) {
5217 // found something in global overflow list; 5216 // found something in global overflow list;
5218 // not yet ready to go stealing work from others. 5217 // not yet ready to go stealing work from others.
5620 CMSParKeepAliveClosure* keep_alive, 5619 CMSParKeepAliveClosure* keep_alive,
5621 int* seed) { 5620 int* seed) {
5622 OopTaskQueue* work_q = work_queue(i); 5621 OopTaskQueue* work_q = work_queue(i);
5623 NOT_PRODUCT(int num_steals = 0;) 5622 NOT_PRODUCT(int num_steals = 0;)
5624 oop obj_to_scan; 5623 oop obj_to_scan;
5625 size_t num_from_overflow_list =
5626 MIN2((size_t)work_q->max_elems()/4,
5627 (size_t)ParGCDesiredObjsFromOverflowList);
5628 5624
5629 while (true) { 5625 while (true) {
5630 // Completely finish any left over work from (an) earlier round(s) 5626 // Completely finish any left over work from (an) earlier round(s)
5631 drain->trim_queue(0); 5627 drain->trim_queue(0);
5628 size_t num_from_overflow_list = MIN2((size_t)(work_q->max_elems() - work_q->size())/4,
5629 (size_t)ParGCDesiredObjsFromOverflowList);
5632 // Now check if there's any work in the overflow list 5630 // Now check if there's any work in the overflow list
5633 if (_collector->par_take_from_overflow_list(num_from_overflow_list, 5631 if (_collector->par_take_from_overflow_list(num_from_overflow_list,
5634 work_q)) { 5632 work_q)) {
5635 // Found something in global overflow list; 5633 // Found something in global overflow list;
5636 // not yet ready to go stealing work from others. 5634 // not yet ready to go stealing work from others.
9019 } 9017 }
9020 9018
9021 // Transfer some number of overflown objects to usual marking 9019 // Transfer some number of overflown objects to usual marking
9022 // stack. Return true if some objects were transferred. 9020 // stack. Return true if some objects were transferred.
9023 bool MarkRefsIntoAndScanClosure::take_from_overflow_list() { 9021 bool MarkRefsIntoAndScanClosure::take_from_overflow_list() {
9024 size_t num = MIN2((size_t)_mark_stack->capacity()/4, 9022 size_t num = MIN2((size_t)(_mark_stack->capacity() - _mark_stack->length())/4,
9025 (size_t)ParGCDesiredObjsFromOverflowList); 9023 (size_t)ParGCDesiredObjsFromOverflowList);
9026 9024
9027 bool res = _collector->take_from_overflow_list(num, _mark_stack); 9025 bool res = _collector->take_from_overflow_list(num, _mark_stack);
9028 assert(_collector->overflow_list_is_empty() || res, 9026 assert(_collector->overflow_list_is_empty() || res,
9029 "If list is not empty, we should have taken something"); 9027 "If list is not empty, we should have taken something");