src/share/vm/gc_implementation/g1/concurrentMark.cpp

changeset 7094
9337d0e7ea4f
parent 7091
a8ea2f110d87
child 7100
edb5f3b38aab
equal deleted inserted replaced
7093:3372cbab6583 7094:9337d0e7ea4f
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) ? " (*)" : "");

mercurial