431 for (int i = 0; i < _index; i += 1) { |
431 for (int i = 0; i < _index; i += 1) { |
432 f->do_oop(&_base[i]); |
432 f->do_oop(&_base[i]); |
433 } |
433 } |
434 } |
434 } |
435 |
435 |
436 bool ConcurrentMark::not_yet_marked(oop obj) const { |
|
437 return _g1h->is_obj_ill(obj); |
|
438 } |
|
439 |
|
440 CMRootRegions::CMRootRegions() : |
436 CMRootRegions::CMRootRegions() : |
441 _young_list(NULL), _cm(NULL), _scan_in_progress(false), |
437 _young_list(NULL), _cm(NULL), _scan_in_progress(false), |
442 _should_abort(false), _next_survivor(NULL) { } |
438 _should_abort(false), _next_survivor(NULL) { } |
443 |
439 |
444 void CMRootRegions::init(G1CollectedHeap* g1h, ConcurrentMark* cm) { |
440 void CMRootRegions::init(G1CollectedHeap* g1h, ConcurrentMark* cm) { |
1114 CMTask* the_task = _cm->task(worker_id); |
1110 CMTask* the_task = _cm->task(worker_id); |
1115 the_task->record_start_time(); |
1111 the_task->record_start_time(); |
1116 if (!_cm->has_aborted()) { |
1112 if (!_cm->has_aborted()) { |
1117 do { |
1113 do { |
1118 double start_vtime_sec = os::elapsedVTime(); |
1114 double start_vtime_sec = os::elapsedVTime(); |
1119 double start_time_sec = os::elapsedTime(); |
|
1120 double mark_step_duration_ms = G1ConcMarkStepDurationMillis; |
1115 double mark_step_duration_ms = G1ConcMarkStepDurationMillis; |
1121 |
1116 |
1122 the_task->do_marking_step(mark_step_duration_ms, |
1117 the_task->do_marking_step(mark_step_duration_ms, |
1123 true /* do_termination */, |
1118 true /* do_termination */, |
1124 false /* is_serial*/); |
1119 false /* is_serial*/); |
1125 |
1120 |
1126 double end_time_sec = os::elapsedTime(); |
|
1127 double end_vtime_sec = os::elapsedVTime(); |
1121 double end_vtime_sec = os::elapsedVTime(); |
1128 double elapsed_vtime_sec = end_vtime_sec - start_vtime_sec; |
1122 double elapsed_vtime_sec = end_vtime_sec - start_vtime_sec; |
1129 double elapsed_time_sec = end_time_sec - start_time_sec; |
|
1130 _cm->clear_has_overflown(); |
1123 _cm->clear_has_overflown(); |
1131 |
1124 |
1132 bool ret = _cm->do_yield_check(worker_id); |
1125 _cm->do_yield_check(worker_id); |
1133 |
1126 |
1134 jlong sleep_time_ms; |
1127 jlong sleep_time_ms; |
1135 if (!_cm->has_aborted() && the_task->has_aborted()) { |
1128 if (!_cm->has_aborted() && the_task->has_aborted()) { |
1136 sleep_time_ms = |
1129 sleep_time_ms = |
1137 (jlong) (elapsed_vtime_sec * _cm->sleep_factor() * 1000.0); |
1130 (jlong) (elapsed_vtime_sec * _cm->sleep_factor() * 1000.0); |
1138 SuspendibleThreadSet::leave(); |
1131 SuspendibleThreadSet::leave(); |
1139 os::sleep(Thread::current(), sleep_time_ms, false); |
1132 os::sleep(Thread::current(), sleep_time_ms, false); |
1140 SuspendibleThreadSet::join(); |
1133 SuspendibleThreadSet::join(); |
1141 } |
1134 } |
1142 double end_time2_sec = os::elapsedTime(); |
|
1143 double elapsed_time2_sec = end_time2_sec - start_time_sec; |
|
1144 |
|
1145 #if 0 |
|
1146 gclog_or_tty->print_cr("CM: elapsed %1.4lf ms, sleep %1.4lf ms, " |
|
1147 "overhead %1.4lf", |
|
1148 elapsed_vtime_sec * 1000.0, (double) sleep_time_ms, |
|
1149 the_task->conc_overhead(os::elapsedTime()) * 8.0); |
|
1150 gclog_or_tty->print_cr("elapsed time %1.4lf ms, time 2: %1.4lf ms", |
|
1151 elapsed_time_sec * 1000.0, elapsed_time2_sec * 1000.0); |
|
1152 #endif |
|
1153 } while (!_cm->has_aborted() && the_task->has_aborted()); |
1135 } while (!_cm->has_aborted() && the_task->has_aborted()); |
1154 } |
1136 } |
1155 the_task->record_end_time(); |
1137 the_task->record_end_time(); |
1156 guarantee(!the_task->has_aborted() || _cm->has_aborted(), "invariant"); |
1138 guarantee(!the_task->has_aborted() || _cm->has_aborted(), "invariant"); |
1157 |
1139 |
2945 |
2927 |
2946 void ConcurrentMark::clearRangeNextBitmap(MemRegion mr) { |
2928 void ConcurrentMark::clearRangeNextBitmap(MemRegion mr) { |
2947 _nextMarkBitMap->clearRange(mr); |
2929 _nextMarkBitMap->clearRange(mr); |
2948 } |
2930 } |
2949 |
2931 |
2950 void ConcurrentMark::clearRangeBothBitmaps(MemRegion mr) { |
|
2951 clearRangePrevBitmap(mr); |
|
2952 clearRangeNextBitmap(mr); |
|
2953 } |
|
2954 |
|
2955 HeapRegion* |
2932 HeapRegion* |
2956 ConcurrentMark::claim_region(uint worker_id) { |
2933 ConcurrentMark::claim_region(uint worker_id) { |
2957 // "checkpoint" the finger |
2934 // "checkpoint" the finger |
2958 HeapWord* finger = _finger; |
2935 HeapWord* finger = _finger; |
2959 |
2936 |
3495 } else { |
3472 } else { |
3496 return false; |
3473 return false; |
3497 } |
3474 } |
3498 } |
3475 } |
3499 |
3476 |
3500 bool ConcurrentMark::containing_card_is_marked(void* p) { |
|
3501 size_t offset = pointer_delta(p, _g1h->reserved_region().start(), 1); |
|
3502 return _card_bm.at(offset >> CardTableModRefBS::card_shift); |
|
3503 } |
|
3504 |
|
3505 bool ConcurrentMark::containing_cards_are_marked(void* start, |
|
3506 void* last) { |
|
3507 return containing_card_is_marked(start) && |
|
3508 containing_card_is_marked(last); |
|
3509 } |
|
3510 |
|
3511 #ifndef PRODUCT |
3477 #ifndef PRODUCT |
3512 // for debugging purposes |
3478 // for debugging purposes |
3513 void ConcurrentMark::print_finger() { |
3479 void ConcurrentMark::print_finger() { |
3514 gclog_or_tty->print_cr("heap ["PTR_FORMAT", "PTR_FORMAT"), global finger = "PTR_FORMAT, |
3480 gclog_or_tty->print_cr("heap ["PTR_FORMAT", "PTR_FORMAT"), global finger = "PTR_FORMAT, |
3515 p2i(_heap_start), p2i(_heap_end), p2i(_finger)); |
3481 p2i(_heap_start), p2i(_heap_end), p2i(_finger)); |
3758 _interval_start_time_ms = curr_time_ms; |
3724 _interval_start_time_ms = curr_time_ms; |
3759 _all_clock_intervals_ms.add(last_interval_ms); |
3725 _all_clock_intervals_ms.add(last_interval_ms); |
3760 |
3726 |
3761 if (_cm->verbose_medium()) { |
3727 if (_cm->verbose_medium()) { |
3762 gclog_or_tty->print_cr("[%u] regular clock, interval = %1.2lfms, " |
3728 gclog_or_tty->print_cr("[%u] regular clock, interval = %1.2lfms, " |
3763 "scanned = %d%s, refs reached = %d%s", |
3729 "scanned = "SIZE_FORMAT"%s, refs reached = "SIZE_FORMAT"%s", |
3764 _worker_id, last_interval_ms, |
3730 _worker_id, last_interval_ms, |
3765 _words_scanned, |
3731 _words_scanned, |
3766 (_words_scanned >= _words_scanned_limit) ? " (*)" : "", |
3732 (_words_scanned >= _words_scanned_limit) ? " (*)" : "", |
3767 _refs_reached, |
3733 _refs_reached, |
3768 (_refs_reached >= _refs_reached_limit) ? " (*)" : ""); |
3734 (_refs_reached >= _refs_reached_limit) ? " (*)" : ""); |