282 _capacity = new_capacity; |
282 _capacity = new_capacity; |
283 } else { |
283 } else { |
284 if (PrintGCDetails && Verbose) { |
284 if (PrintGCDetails && Verbose) { |
285 // Failed to double capacity, continue; |
285 // Failed to double capacity, continue; |
286 gclog_or_tty->print(" (benign) Failed to expand marking stack capacity from " |
286 gclog_or_tty->print(" (benign) Failed to expand marking stack capacity from " |
287 SIZE_FORMAT"K to " SIZE_FORMAT"K", |
287 SIZE_FORMAT "K to " SIZE_FORMAT "K", |
288 _capacity / K, new_capacity / K); |
288 _capacity / K, new_capacity / K); |
289 } |
289 } |
290 } |
290 } |
291 } |
291 } |
292 |
292 |
579 verbose_level = high_verbose; |
579 verbose_level = high_verbose; |
580 } |
580 } |
581 _verbose_level = verbose_level; |
581 _verbose_level = verbose_level; |
582 |
582 |
583 if (verbose_low()) { |
583 if (verbose_low()) { |
584 gclog_or_tty->print_cr("[global] init, heap start = "PTR_FORMAT", " |
584 gclog_or_tty->print_cr("[global] init, heap start = " PTR_FORMAT", " |
585 "heap end = " INTPTR_FORMAT, p2i(_heap_start), p2i(_heap_end)); |
585 "heap end = " INTPTR_FORMAT, p2i(_heap_start), p2i(_heap_end)); |
586 } |
586 } |
587 |
587 |
588 _markBitMap1.initialize(g1h->reserved_region(), prev_bitmap_storage); |
588 _markBitMap1.initialize(g1h->reserved_region(), prev_bitmap_storage); |
589 _markBitMap2.initialize(g1h->reserved_region(), next_bitmap_storage); |
589 _markBitMap2.initialize(g1h->reserved_region(), next_bitmap_storage); |
835 // We currently assume that the concurrent flag has been set to |
835 // We currently assume that the concurrent flag has been set to |
836 // false before we start remark. At this point we should also be |
836 // false before we start remark. At this point we should also be |
837 // in a STW phase. |
837 // in a STW phase. |
838 assert(!concurrent_marking_in_progress(), "invariant"); |
838 assert(!concurrent_marking_in_progress(), "invariant"); |
839 assert(out_of_regions(), |
839 assert(out_of_regions(), |
840 err_msg("only way to get here: _finger: "PTR_FORMAT", _heap_end: "PTR_FORMAT, |
840 err_msg("only way to get here: _finger: " PTR_FORMAT ", _heap_end: " PTR_FORMAT, |
841 p2i(_finger), p2i(_heap_end))); |
841 p2i(_finger), p2i(_heap_end))); |
842 } |
842 } |
843 } |
843 } |
844 |
844 |
845 void ConcurrentMark::set_non_marking_state() { |
845 void ConcurrentMark::set_non_marking_state() { |
1450 HeapWord* ntams = hr->next_top_at_mark_start(); |
1450 HeapWord* ntams = hr->next_top_at_mark_start(); |
1451 HeapWord* start = hr->bottom(); |
1451 HeapWord* start = hr->bottom(); |
1452 |
1452 |
1453 assert(start <= hr->end() && start <= ntams && ntams <= hr->end(), |
1453 assert(start <= hr->end() && start <= ntams && ntams <= hr->end(), |
1454 err_msg("Preconditions not met - " |
1454 err_msg("Preconditions not met - " |
1455 "start: "PTR_FORMAT", ntams: "PTR_FORMAT", end: "PTR_FORMAT, |
1455 "start: " PTR_FORMAT ", ntams: " PTR_FORMAT ", end: " PTR_FORMAT, |
1456 p2i(start), p2i(ntams), p2i(hr->end()))); |
1456 p2i(start), p2i(ntams), p2i(hr->end()))); |
1457 |
1457 |
1458 // Find the first marked object at or after "start". |
1458 // Find the first marked object at or after "start". |
1459 start = _bm->getNextMarkedWordAddress(start, ntams); |
1459 start = _bm->getNextMarkedWordAddress(start, ntams); |
1460 |
1460 |
1767 // all the cards spanned by the object |
1767 // all the cards spanned by the object |
1768 end_idx += 1; |
1768 end_idx += 1; |
1769 } |
1769 } |
1770 |
1770 |
1771 assert(end_idx <= _card_bm->size(), |
1771 assert(end_idx <= _card_bm->size(), |
1772 err_msg("oob: end_idx= "SIZE_FORMAT", bitmap size= "SIZE_FORMAT, |
1772 err_msg("oob: end_idx= " SIZE_FORMAT ", bitmap size= " SIZE_FORMAT, |
1773 end_idx, _card_bm->size())); |
1773 end_idx, _card_bm->size())); |
1774 assert(start_idx < _card_bm->size(), |
1774 assert(start_idx < _card_bm->size(), |
1775 err_msg("oob: start_idx= "SIZE_FORMAT", bitmap size= "SIZE_FORMAT, |
1775 err_msg("oob: start_idx= " SIZE_FORMAT ", bitmap size= " SIZE_FORMAT, |
1776 start_idx, _card_bm->size())); |
1776 start_idx, _card_bm->size())); |
1777 |
1777 |
1778 _cm->set_card_bitmap_range(_card_bm, start_idx, end_idx, true /* is_par */); |
1778 _cm->set_card_bitmap_range(_card_bm, start_idx, end_idx, true /* is_par */); |
1779 } |
1779 } |
1780 |
1780 |
2275 template <class T> void do_oop_work(T* p) { |
2275 template <class T> void do_oop_work(T* p) { |
2276 if (!_cm->has_overflown()) { |
2276 if (!_cm->has_overflown()) { |
2277 oop obj = oopDesc::load_decode_heap_oop(p); |
2277 oop obj = oopDesc::load_decode_heap_oop(p); |
2278 if (_cm->verbose_high()) { |
2278 if (_cm->verbose_high()) { |
2279 gclog_or_tty->print_cr("\t[%u] we're looking at location " |
2279 gclog_or_tty->print_cr("\t[%u] we're looking at location " |
2280 "*"PTR_FORMAT" = "PTR_FORMAT, |
2280 "*" PTR_FORMAT " = " PTR_FORMAT, |
2281 _task->worker_id(), p2i(p), p2i((void*) obj)); |
2281 _task->worker_id(), p2i(p), p2i((void*) obj)); |
2282 } |
2282 } |
2283 |
2283 |
2284 _task->deal_with_reference(obj); |
2284 _task->deal_with_reference(obj); |
2285 _ref_counter--; |
2285 _ref_counter--; |
3016 // we succeeded |
3016 // we succeeded |
3017 HeapWord* bottom = curr_region->bottom(); |
3017 HeapWord* bottom = curr_region->bottom(); |
3018 HeapWord* limit = curr_region->next_top_at_mark_start(); |
3018 HeapWord* limit = curr_region->next_top_at_mark_start(); |
3019 |
3019 |
3020 if (verbose_low()) { |
3020 if (verbose_low()) { |
3021 gclog_or_tty->print_cr("[%u] curr_region = "PTR_FORMAT" " |
3021 gclog_or_tty->print_cr("[%u] curr_region = " PTR_FORMAT " " |
3022 "["PTR_FORMAT", "PTR_FORMAT"), " |
3022 "[" PTR_FORMAT ", " PTR_FORMAT "), " |
3023 "limit = "PTR_FORMAT, |
3023 "limit = " PTR_FORMAT, |
3024 worker_id, p2i(curr_region), p2i(bottom), p2i(end), p2i(limit)); |
3024 worker_id, p2i(curr_region), p2i(bottom), p2i(end), p2i(limit)); |
3025 } |
3025 } |
3026 |
3026 |
3027 // notice that _finger == end cannot be guaranteed here since, |
3027 // notice that _finger == end cannot be guaranteed here since, |
3028 // someone else might have moved the finger even further |
3028 // someone else might have moved the finger even further |
3033 PTR_FORMAT, worker_id, p2i(curr_region)); |
3033 PTR_FORMAT, worker_id, p2i(curr_region)); |
3034 } |
3034 } |
3035 |
3035 |
3036 if (limit > bottom) { |
3036 if (limit > bottom) { |
3037 if (verbose_low()) { |
3037 if (verbose_low()) { |
3038 gclog_or_tty->print_cr("[%u] region "PTR_FORMAT" is not empty, " |
3038 gclog_or_tty->print_cr("[%u] region " PTR_FORMAT " is not empty, " |
3039 "returning it ", worker_id, p2i(curr_region)); |
3039 "returning it ", worker_id, p2i(curr_region)); |
3040 } |
3040 } |
3041 return curr_region; |
3041 return curr_region; |
3042 } else { |
3042 } else { |
3043 assert(limit == bottom, |
3043 assert(limit == bottom, |
3044 "the region limit should be at bottom"); |
3044 "the region limit should be at bottom"); |
3045 if (verbose_low()) { |
3045 if (verbose_low()) { |
3046 gclog_or_tty->print_cr("[%u] region "PTR_FORMAT" is empty, " |
3046 gclog_or_tty->print_cr("[%u] region " PTR_FORMAT " is empty, " |
3047 "returning NULL", worker_id, p2i(curr_region)); |
3047 "returning NULL", worker_id, p2i(curr_region)); |
3048 } |
3048 } |
3049 // we return NULL and the caller should try calling |
3049 // we return NULL and the caller should try calling |
3050 // claim_region() again. |
3050 // claim_region() again. |
3051 return NULL; |
3051 return NULL; |
3053 } else { |
3053 } else { |
3054 assert(_finger > finger, "the finger should have moved forward"); |
3054 assert(_finger > finger, "the finger should have moved forward"); |
3055 if (verbose_low()) { |
3055 if (verbose_low()) { |
3056 if (curr_region == NULL) { |
3056 if (curr_region == NULL) { |
3057 gclog_or_tty->print_cr("[%u] found uncommitted region, moving finger, " |
3057 gclog_or_tty->print_cr("[%u] found uncommitted region, moving finger, " |
3058 "global finger = "PTR_FORMAT", " |
3058 "global finger = " PTR_FORMAT ", " |
3059 "our finger = "PTR_FORMAT, |
3059 "our finger = " PTR_FORMAT, |
3060 worker_id, p2i(_finger), p2i(finger)); |
3060 worker_id, p2i(_finger), p2i(finger)); |
3061 } else { |
3061 } else { |
3062 gclog_or_tty->print_cr("[%u] somebody else moved the finger, " |
3062 gclog_or_tty->print_cr("[%u] somebody else moved the finger, " |
3063 "global finger = "PTR_FORMAT", " |
3063 "global finger = " PTR_FORMAT ", " |
3064 "our finger = "PTR_FORMAT, |
3064 "our finger = " PTR_FORMAT, |
3065 worker_id, p2i(_finger), p2i(finger)); |
3065 worker_id, p2i(_finger), p2i(finger)); |
3066 } |
3066 } |
3067 } |
3067 } |
3068 |
3068 |
3069 // read it again |
3069 // read it again |
3095 return NULL; |
3095 return NULL; |
3096 } |
3096 } |
3097 |
3097 |
3098 void do_object_work(oop obj) { |
3098 void do_object_work(oop obj) { |
3099 guarantee(!_g1h->obj_in_cs(obj), |
3099 guarantee(!_g1h->obj_in_cs(obj), |
3100 err_msg("obj: "PTR_FORMAT" in CSet, phase: %s, info: %d", |
3100 err_msg("obj: " PTR_FORMAT " in CSet, phase: %s, info: %d", |
3101 p2i((void*) obj), phase_str(), _info)); |
3101 p2i((void*) obj), phase_str(), _info)); |
3102 } |
3102 } |
3103 |
3103 |
3104 public: |
3104 public: |
3105 VerifyNoCSetOopsClosure() : _g1h(G1CollectedHeap::heap()) { } |
3105 VerifyNoCSetOopsClosure() : _g1h(G1CollectedHeap::heap()) { } |
3156 // not hold any more. |
3156 // not hold any more. |
3157 // Since we always iterate over all regions, we might get a NULL HeapRegion |
3157 // Since we always iterate over all regions, we might get a NULL HeapRegion |
3158 // here. |
3158 // here. |
3159 HeapRegion* global_hr = _g1h->heap_region_containing_raw(global_finger); |
3159 HeapRegion* global_hr = _g1h->heap_region_containing_raw(global_finger); |
3160 guarantee(global_hr == NULL || global_finger == global_hr->bottom(), |
3160 guarantee(global_hr == NULL || global_finger == global_hr->bottom(), |
3161 err_msg("global finger: "PTR_FORMAT" region: "HR_FORMAT, |
3161 err_msg("global finger: " PTR_FORMAT " region: " HR_FORMAT, |
3162 p2i(global_finger), HR_FORMAT_PARAMS(global_hr))); |
3162 p2i(global_finger), HR_FORMAT_PARAMS(global_hr))); |
3163 } |
3163 } |
3164 |
3164 |
3165 // Verify the task fingers |
3165 // Verify the task fingers |
3166 assert(parallel_marking_threads() <= _max_worker_id, "sanity"); |
3166 assert(parallel_marking_threads() <= _max_worker_id, "sanity"); |
3170 if (task_finger != NULL && task_finger < _heap_end) { |
3170 if (task_finger != NULL && task_finger < _heap_end) { |
3171 // See above note on the global finger verification. |
3171 // See above note on the global finger verification. |
3172 HeapRegion* task_hr = _g1h->heap_region_containing_raw(task_finger); |
3172 HeapRegion* task_hr = _g1h->heap_region_containing_raw(task_finger); |
3173 guarantee(task_hr == NULL || task_finger == task_hr->bottom() || |
3173 guarantee(task_hr == NULL || task_finger == task_hr->bottom() || |
3174 !task_hr->in_collection_set(), |
3174 !task_hr->in_collection_set(), |
3175 err_msg("task finger: "PTR_FORMAT" region: "HR_FORMAT, |
3175 err_msg("task finger: " PTR_FORMAT " region: " HR_FORMAT, |
3176 p2i(task_finger), HR_FORMAT_PARAMS(task_hr))); |
3176 p2i(task_finger), HR_FORMAT_PARAMS(task_hr))); |
3177 } |
3177 } |
3178 } |
3178 } |
3179 } |
3179 } |
3180 #endif // PRODUCT |
3180 #endif // PRODUCT |
3212 HeapWord* limit = hr->next_top_at_mark_start(); |
3212 HeapWord* limit = hr->next_top_at_mark_start(); |
3213 HeapWord* end = hr->end(); |
3213 HeapWord* end = hr->end(); |
3214 |
3214 |
3215 assert(start <= limit && limit <= hr->top() && hr->top() <= hr->end(), |
3215 assert(start <= limit && limit <= hr->top() && hr->top() <= hr->end(), |
3216 err_msg("Preconditions not met - " |
3216 err_msg("Preconditions not met - " |
3217 "start: "PTR_FORMAT", limit: "PTR_FORMAT", " |
3217 "start: " PTR_FORMAT ", limit: " PTR_FORMAT ", " |
3218 "top: "PTR_FORMAT", end: "PTR_FORMAT, |
3218 "top: " PTR_FORMAT ", end: " PTR_FORMAT, |
3219 p2i(start), p2i(limit), p2i(hr->top()), p2i(hr->end()))); |
3219 p2i(start), p2i(limit), p2i(hr->top()), p2i(hr->end()))); |
3220 |
3220 |
3221 assert(hr->next_marked_bytes() == 0, "Precondition"); |
3221 assert(hr->next_marked_bytes() == 0, "Precondition"); |
3222 |
3222 |
3223 if (start == limit) { |
3223 if (start == limit) { |
3492 } |
3492 } |
3493 |
3493 |
3494 #ifndef PRODUCT |
3494 #ifndef PRODUCT |
3495 // for debugging purposes |
3495 // for debugging purposes |
3496 void ConcurrentMark::print_finger() { |
3496 void ConcurrentMark::print_finger() { |
3497 gclog_or_tty->print_cr("heap ["PTR_FORMAT", "PTR_FORMAT"), global finger = "PTR_FORMAT, |
3497 gclog_or_tty->print_cr("heap [" PTR_FORMAT ", " PTR_FORMAT "), global finger = " PTR_FORMAT, |
3498 p2i(_heap_start), p2i(_heap_end), p2i(_finger)); |
3498 p2i(_heap_start), p2i(_heap_end), p2i(_finger)); |
3499 for (uint i = 0; i < _max_worker_id; ++i) { |
3499 for (uint i = 0; i < _max_worker_id; ++i) { |
3500 gclog_or_tty->print(" %u: " PTR_FORMAT, i, p2i(_tasks[i]->finger())); |
3500 gclog_or_tty->print(" %u: " PTR_FORMAT, i, p2i(_tasks[i]->finger())); |
3501 } |
3501 } |
3502 gclog_or_tty->cr(); |
3502 gclog_or_tty->cr(); |
3577 "claim_region() should have filtered out NULL regions"); |
3577 "claim_region() should have filtered out NULL regions"); |
3578 assert(!hr->continuesHumongous(), |
3578 assert(!hr->continuesHumongous(), |
3579 "claim_region() should have filtered out continues humongous regions"); |
3579 "claim_region() should have filtered out continues humongous regions"); |
3580 |
3580 |
3581 if (_cm->verbose_low()) { |
3581 if (_cm->verbose_low()) { |
3582 gclog_or_tty->print_cr("[%u] setting up for region "PTR_FORMAT, |
3582 gclog_or_tty->print_cr("[%u] setting up for region " PTR_FORMAT, |
3583 _worker_id, p2i(hr)); |
3583 _worker_id, p2i(hr)); |
3584 } |
3584 } |
3585 |
3585 |
3586 _curr_region = hr; |
3586 _curr_region = hr; |
3587 _finger = hr->bottom(); |
3587 _finger = hr->bottom(); |
3594 HeapWord* limit = hr->next_top_at_mark_start(); |
3594 HeapWord* limit = hr->next_top_at_mark_start(); |
3595 |
3595 |
3596 if (limit == bottom) { |
3596 if (limit == bottom) { |
3597 if (_cm->verbose_low()) { |
3597 if (_cm->verbose_low()) { |
3598 gclog_or_tty->print_cr("[%u] found an empty region " |
3598 gclog_or_tty->print_cr("[%u] found an empty region " |
3599 "["PTR_FORMAT", "PTR_FORMAT")", |
3599 "[" PTR_FORMAT ", " PTR_FORMAT ")", |
3600 _worker_id, p2i(bottom), p2i(limit)); |
3600 _worker_id, p2i(bottom), p2i(limit)); |
3601 } |
3601 } |
3602 // The region was collected underneath our feet. |
3602 // The region was collected underneath our feet. |
3603 // We set the finger to bottom to ensure that the bitmap |
3603 // We set the finger to bottom to ensure that the bitmap |
3604 // iteration that will follow this will not do anything. |
3604 // iteration that will follow this will not do anything. |
3626 } |
3626 } |
3627 |
3627 |
3628 void CMTask::giveup_current_region() { |
3628 void CMTask::giveup_current_region() { |
3629 assert(_curr_region != NULL, "invariant"); |
3629 assert(_curr_region != NULL, "invariant"); |
3630 if (_cm->verbose_low()) { |
3630 if (_cm->verbose_low()) { |
3631 gclog_or_tty->print_cr("[%u] giving up region "PTR_FORMAT, |
3631 gclog_or_tty->print_cr("[%u] giving up region " PTR_FORMAT, |
3632 _worker_id, p2i(_curr_region)); |
3632 _worker_id, p2i(_curr_region)); |
3633 } |
3633 } |
3634 clear_region_fields(); |
3634 clear_region_fields(); |
3635 } |
3635 } |
3636 |
3636 |
3748 _interval_start_time_ms = curr_time_ms; |
3748 _interval_start_time_ms = curr_time_ms; |
3749 _all_clock_intervals_ms.add(last_interval_ms); |
3749 _all_clock_intervals_ms.add(last_interval_ms); |
3750 |
3750 |
3751 if (_cm->verbose_medium()) { |
3751 if (_cm->verbose_medium()) { |
3752 gclog_or_tty->print_cr("[%u] regular clock, interval = %1.2lfms, " |
3752 gclog_or_tty->print_cr("[%u] regular clock, interval = %1.2lfms, " |
3753 "scanned = "SIZE_FORMAT"%s, refs reached = "SIZE_FORMAT"%s", |
3753 "scanned = " SIZE_FORMAT "%s, refs reached = " SIZE_FORMAT "%s", |
3754 _worker_id, last_interval_ms, |
3754 _worker_id, last_interval_ms, |
3755 _words_scanned, |
3755 _words_scanned, |
3756 (_words_scanned >= _words_scanned_limit) ? " (*)" : "", |
3756 (_words_scanned >= _words_scanned_limit) ? " (*)" : "", |
3757 _refs_reached, |
3757 _refs_reached, |
3758 (_refs_reached >= _refs_reached_limit) ? " (*)" : ""); |
3758 (_refs_reached >= _refs_reached_limit) ? " (*)" : ""); |
3917 bool ret = _task_queue->pop_local(obj); |
3917 bool ret = _task_queue->pop_local(obj); |
3918 while (ret) { |
3918 while (ret) { |
3919 statsOnly( ++_local_pops ); |
3919 statsOnly( ++_local_pops ); |
3920 |
3920 |
3921 if (_cm->verbose_high()) { |
3921 if (_cm->verbose_high()) { |
3922 gclog_or_tty->print_cr("[%u] popped "PTR_FORMAT, _worker_id, |
3922 gclog_or_tty->print_cr("[%u] popped " PTR_FORMAT, _worker_id, |
3923 p2i((void*) obj)); |
3923 p2i((void*) obj)); |
3924 } |
3924 } |
3925 |
3925 |
3926 assert(_g1h->is_in_g1_reserved((HeapWord*) obj), "invariant" ); |
3926 assert(_g1h->is_in_g1_reserved((HeapWord*) obj), "invariant" ); |
3927 assert(!_g1h->is_on_master_free_list( |
3927 assert(!_g1h->is_on_master_free_list( |
4270 // fresh region, _finger points to start(). |
4270 // fresh region, _finger points to start(). |
4271 MemRegion mr = MemRegion(_finger, _region_limit); |
4271 MemRegion mr = MemRegion(_finger, _region_limit); |
4272 |
4272 |
4273 if (_cm->verbose_low()) { |
4273 if (_cm->verbose_low()) { |
4274 gclog_or_tty->print_cr("[%u] we're scanning part " |
4274 gclog_or_tty->print_cr("[%u] we're scanning part " |
4275 "["PTR_FORMAT", "PTR_FORMAT") " |
4275 "[" PTR_FORMAT ", " PTR_FORMAT ") " |
4276 "of region "HR_FORMAT, |
4276 "of region " HR_FORMAT, |
4277 _worker_id, p2i(_finger), p2i(_region_limit), |
4277 _worker_id, p2i(_finger), p2i(_region_limit), |
4278 HR_FORMAT_PARAMS(_curr_region)); |
4278 HR_FORMAT_PARAMS(_curr_region)); |
4279 } |
4279 } |
4280 |
4280 |
4281 assert(!_curr_region->isHumongous() || mr.start() == _curr_region->bottom(), |
4281 assert(!_curr_region->isHumongous() || mr.start() == _curr_region->bottom(), |
4358 // Yes, we managed to claim one |
4358 // Yes, we managed to claim one |
4359 statsOnly( ++_regions_claimed ); |
4359 statsOnly( ++_regions_claimed ); |
4360 |
4360 |
4361 if (_cm->verbose_low()) { |
4361 if (_cm->verbose_low()) { |
4362 gclog_or_tty->print_cr("[%u] we successfully claimed " |
4362 gclog_or_tty->print_cr("[%u] we successfully claimed " |
4363 "region "PTR_FORMAT, |
4363 "region " PTR_FORMAT, |
4364 _worker_id, p2i(claimed_region)); |
4364 _worker_id, p2i(claimed_region)); |
4365 } |
4365 } |
4366 |
4366 |
4367 setup_for_region(claimed_region); |
4367 setup_for_region(claimed_region); |
4368 assert(_curr_region == claimed_region, "invariant"); |
4368 assert(_curr_region == claimed_region, "invariant"); |
4419 oop obj; |
4419 oop obj; |
4420 statsOnly( ++_steal_attempts ); |
4420 statsOnly( ++_steal_attempts ); |
4421 |
4421 |
4422 if (_cm->try_stealing(_worker_id, &_hash_seed, obj)) { |
4422 if (_cm->try_stealing(_worker_id, &_hash_seed, obj)) { |
4423 if (_cm->verbose_medium()) { |
4423 if (_cm->verbose_medium()) { |
4424 gclog_or_tty->print_cr("[%u] stolen "PTR_FORMAT" successfully", |
4424 gclog_or_tty->print_cr("[%u] stolen " PTR_FORMAT " successfully", |
4425 _worker_id, p2i((void*) obj)); |
4425 _worker_id, p2i((void*) obj)); |
4426 } |
4426 } |
4427 |
4427 |
4428 statsOnly( ++_steals ); |
4428 statsOnly( ++_steals ); |
4429 |
4429 |
4627 |
4627 |
4628 // All the output lines are prefixed with this string to be able to |
4628 // All the output lines are prefixed with this string to be able to |
4629 // identify them easily in a large log file. |
4629 // identify them easily in a large log file. |
4630 #define G1PPRL_LINE_PREFIX "###" |
4630 #define G1PPRL_LINE_PREFIX "###" |
4631 |
4631 |
4632 #define G1PPRL_ADDR_BASE_FORMAT " "PTR_FORMAT"-"PTR_FORMAT |
4632 #define G1PPRL_ADDR_BASE_FORMAT " " PTR_FORMAT "-" PTR_FORMAT |
4633 #ifdef _LP64 |
4633 #ifdef _LP64 |
4634 #define G1PPRL_ADDR_BASE_H_FORMAT " %37s" |
4634 #define G1PPRL_ADDR_BASE_H_FORMAT " %37s" |
4635 #else // _LP64 |
4635 #else // _LP64 |
4636 #define G1PPRL_ADDR_BASE_H_FORMAT " %21s" |
4636 #define G1PPRL_ADDR_BASE_H_FORMAT " %21s" |
4637 #endif // _LP64 |
4637 #endif // _LP64 |
4638 |
4638 |
4639 // For per-region info |
4639 // For per-region info |
4640 #define G1PPRL_TYPE_FORMAT " %-4s" |
4640 #define G1PPRL_TYPE_FORMAT " %-4s" |
4641 #define G1PPRL_TYPE_H_FORMAT " %4s" |
4641 #define G1PPRL_TYPE_H_FORMAT " %4s" |
4642 #define G1PPRL_BYTE_FORMAT " "SIZE_FORMAT_W(9) |
4642 #define G1PPRL_BYTE_FORMAT " " SIZE_FORMAT_W(9) |
4643 #define G1PPRL_BYTE_H_FORMAT " %9s" |
4643 #define G1PPRL_BYTE_H_FORMAT " %9s" |
4644 #define G1PPRL_DOUBLE_FORMAT " %14.1f" |
4644 #define G1PPRL_DOUBLE_FORMAT " %14.1f" |
4645 #define G1PPRL_DOUBLE_H_FORMAT " %14s" |
4645 #define G1PPRL_DOUBLE_H_FORMAT " %14s" |
4646 |
4646 |
4647 // For summary info |
4647 // For summary info |
4648 #define G1PPRL_SUM_ADDR_FORMAT(tag) " "tag":"G1PPRL_ADDR_BASE_FORMAT |
4648 #define G1PPRL_SUM_ADDR_FORMAT(tag) " " tag ":" G1PPRL_ADDR_BASE_FORMAT |
4649 #define G1PPRL_SUM_BYTE_FORMAT(tag) " "tag": "SIZE_FORMAT |
4649 #define G1PPRL_SUM_BYTE_FORMAT(tag) " " tag ": " SIZE_FORMAT |
4650 #define G1PPRL_SUM_MB_FORMAT(tag) " "tag": %1.2f MB" |
4650 #define G1PPRL_SUM_MB_FORMAT(tag) " " tag ": %1.2f MB" |
4651 #define G1PPRL_SUM_MB_PERC_FORMAT(tag) G1PPRL_SUM_MB_FORMAT(tag)" / %1.2f %%" |
4651 #define G1PPRL_SUM_MB_PERC_FORMAT(tag) G1PPRL_SUM_MB_FORMAT(tag) " / %1.2f %%" |
4652 |
4652 |
4653 G1PrintRegionLivenessInfoClosure:: |
4653 G1PrintRegionLivenessInfoClosure:: |
4654 G1PrintRegionLivenessInfoClosure(outputStream* out, const char* phase_name) |
4654 G1PrintRegionLivenessInfoClosure(outputStream* out, const char* phase_name) |
4655 : _out(out), |
4655 : _out(out), |
4656 _total_used_bytes(0), _total_capacity_bytes(0), |
4656 _total_used_bytes(0), _total_capacity_bytes(0), |