Mercurial > hg > graal-jvmci-8
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"); |