< prev index next >

src/hotspot/share/gc/g1/g1FullGCMarker.cpp

Print this page

 51 G1FullGCMarker::~G1FullGCMarker() {
 52   assert(is_task_queue_empty(), "Must be empty at this point");
 53 }
 54 
 55 void G1FullGCMarker::process_partial_array(PartialArrayState* state, bool stolen) {
 56   // Access state before release by claim().
 57   objArrayOop obj_array = objArrayOop(state->source());
 58   PartialArraySplitter::Claim claim =
 59     _partial_array_splitter.claim(state, task_queue(), stolen);
 60   process_array_chunk(obj_array, claim._start, claim._end);
 61 }
 62 
 63 static uintx calc_array_stride(uint array_len, uint num_threads) {
 64   precond(num_threads > 0);
 65 
 66   const size_t stride = (array_len + num_threads - 1) / num_threads;
 67   return clamp(stride, ArrayMarkingMinStride, ObjArrayMarkingStride);
 68 }
 69 
 70 void G1FullGCMarker::start_partial_array_processing(objArrayOop obj) {

 71   mark_closure()->do_klass(obj->klass());

 72   // Don't push empty arrays to avoid unnecessary work.
 73   const int array_length = obj->length();
 74 
 75   if (array_length == 0) {
 76     return;
 77   }
 78 
 79   const uintx stride = calc_array_stride(array_length, _collector->workers());
 80   const size_t initial_chunk_size = _partial_array_splitter.start(task_queue(), obj, nullptr, array_length, stride);
 81 
 82   process_array_chunk(obj, 0, initial_chunk_size);
 83 }
 84 
 85 void G1FullGCMarker::complete_marking(G1ScannerTasksQueueSet* task_queues,
 86                                       TaskTerminator* terminator) {
 87   do {
 88     process_marking_stacks();
 89     ScannerTask stolen_task;
 90     if (task_queues->steal(_worker_id, stolen_task)) {
 91       dispatch_task(stolen_task, true);

 51 G1FullGCMarker::~G1FullGCMarker() {
 52   assert(is_task_queue_empty(), "Must be empty at this point");
 53 }
 54 
 55 void G1FullGCMarker::process_partial_array(PartialArrayState* state, bool stolen) {
 56   // Access state before release by claim().
 57   objArrayOop obj_array = objArrayOop(state->source());
 58   PartialArraySplitter::Claim claim =
 59     _partial_array_splitter.claim(state, task_queue(), stolen);
 60   process_array_chunk(obj_array, claim._start, claim._end);
 61 }
 62 
 63 static uintx calc_array_stride(uint array_len, uint num_threads) {
 64   precond(num_threads > 0);
 65 
 66   const size_t stride = (array_len + num_threads - 1) / num_threads;
 67   return clamp(stride, ArrayMarkingMinStride, ObjArrayMarkingStride);
 68 }
 69 
 70 void G1FullGCMarker::start_partial_array_processing(objArrayOop obj) {
 71   precond(obj->is_array_with_oops());
 72   mark_closure()->do_klass(obj->klass());
 73 
 74   // Don't push empty arrays to avoid unnecessary work.
 75   const int array_length = obj->length();
 76 
 77   if (array_length == 0) {
 78     return;
 79   }
 80 
 81   const uintx stride = calc_array_stride(array_length, _collector->workers());
 82   const size_t initial_chunk_size = _partial_array_splitter.start(task_queue(), obj, nullptr, array_length, stride);
 83 
 84   process_array_chunk(obj, 0, initial_chunk_size);
 85 }
 86 
 87 void G1FullGCMarker::complete_marking(G1ScannerTasksQueueSet* task_queues,
 88                                       TaskTerminator* terminator) {
 89   do {
 90     process_marking_stacks();
 91     ScannerTask stolen_task;
 92     if (task_queues->steal(_worker_id, stolen_task)) {
 93       dispatch_task(stolen_task, true);
< prev index next >