comparison src/share/vm/gc_implementation/g1/concurrentMark.inline.hpp @ 4837:eff609af17d7

7127706: G1: re-enable survivors during the initial-mark pause Summary: Re-enable survivors during the initial-mark pause. Afterwards, the concurrent marking threads have to scan them and mark everything reachable from them. The next GC will have to wait for the survivors to be scanned. Reviewed-by: brutisso, johnc
author tonyp
date Wed, 25 Jan 2012 12:58:23 -0500
parents d30fa85f9994
children 720b6a76dd9d
comparison
equal deleted inserted replaced
4836:d30fa85f9994 4837:eff609af17d7
79 // Note: BitMap::set_range() is exclusive. 79 // Note: BitMap::set_range() is exclusive.
80 task_card_bm->set_range(start_idx, last_idx+1); 80 task_card_bm->set_range(start_idx, last_idx+1);
81 } 81 }
82 } 82 }
83 83
84 // Counts the given memory region in the task/worker counting
85 // data structures for the given worker id.
86 inline void ConcurrentMark::count_region(MemRegion mr,
87 HeapRegion* hr,
88 uint worker_id) {
89 size_t* marked_bytes_array = count_marked_bytes_array_for(worker_id);
90 BitMap* task_card_bm = count_card_bitmap_for(worker_id);
91 count_region(mr, hr, marked_bytes_array, task_card_bm);
92 }
93
84 // Counts the given memory region, which may be a single object, in the 94 // Counts the given memory region, which may be a single object, in the
85 // task/worker counting data structures for the given worker id. 95 // task/worker counting data structures for the given worker id.
86 inline void ConcurrentMark::count_region(MemRegion mr, uint worker_id) { 96 inline void ConcurrentMark::count_region(MemRegion mr, uint worker_id) {
87 size_t* marked_bytes_array = count_marked_bytes_array_for(worker_id);
88 BitMap* task_card_bm = count_card_bitmap_for(worker_id);
89 HeapWord* addr = mr.start(); 97 HeapWord* addr = mr.start();
90 HeapRegion* hr = _g1h->heap_region_containing_raw(addr); 98 HeapRegion* hr = _g1h->heap_region_containing_raw(addr);
91 count_region(mr, hr, marked_bytes_array, task_card_bm); 99 count_region(mr, hr, worker_id);
92 } 100 }
93 101
94 // Counts the given object in the given task/worker counting data structures. 102 // Counts the given object in the given task/worker counting data structures.
95 inline void ConcurrentMark::count_object(oop obj, 103 inline void ConcurrentMark::count_object(oop obj,
96 HeapRegion* hr, 104 HeapRegion* hr,
100 count_region(mr, hr, marked_bytes_array, task_card_bm); 108 count_region(mr, hr, marked_bytes_array, task_card_bm);
101 } 109 }
102 110
103 // Counts the given object in the task/worker counting data 111 // Counts the given object in the task/worker counting data
104 // structures for the given worker id. 112 // structures for the given worker id.
105 inline void ConcurrentMark::count_object(oop obj, HeapRegion* hr, uint worker_id) { 113 inline void ConcurrentMark::count_object(oop obj,
114 HeapRegion* hr,
115 uint worker_id) {
106 size_t* marked_bytes_array = count_marked_bytes_array_for(worker_id); 116 size_t* marked_bytes_array = count_marked_bytes_array_for(worker_id);
107 BitMap* task_card_bm = count_card_bitmap_for(worker_id); 117 BitMap* task_card_bm = count_card_bitmap_for(worker_id);
108 HeapWord* addr = (HeapWord*) obj; 118 HeapWord* addr = (HeapWord*) obj;
109 count_object(obj, hr, marked_bytes_array, task_card_bm); 119 count_object(obj, hr, marked_bytes_array, task_card_bm);
110 } 120 }
117 BitMap* task_card_bm) { 127 BitMap* task_card_bm) {
118 HeapWord* addr = (HeapWord*)obj; 128 HeapWord* addr = (HeapWord*)obj;
119 if (_nextMarkBitMap->parMark(addr)) { 129 if (_nextMarkBitMap->parMark(addr)) {
120 // Update the task specific count data for the object. 130 // Update the task specific count data for the object.
121 count_object(obj, hr, marked_bytes_array, task_card_bm); 131 count_object(obj, hr, marked_bytes_array, task_card_bm);
132 return true;
133 }
134 return false;
135 }
136
137 // Attempts to mark the given object and, if successful, counts
138 // the object in the task/worker counting structures for the
139 // given worker id.
140 inline bool ConcurrentMark::par_mark_and_count(oop obj,
141 size_t word_size,
142 HeapRegion* hr,
143 uint worker_id) {
144 HeapWord* addr = (HeapWord*)obj;
145 if (_nextMarkBitMap->parMark(addr)) {
146 MemRegion mr(addr, word_size);
147 count_region(mr, hr, worker_id);
122 return true; 148 return true;
123 } 149 }
124 return false; 150 return false;
125 } 151 }
126 152
340 // Note we are overriding the read-only view of the prev map here, via 366 // Note we are overriding the read-only view of the prev map here, via
341 // the cast. 367 // the cast.
342 ((CMBitMap*)_prevMarkBitMap)->mark((HeapWord*) p); 368 ((CMBitMap*)_prevMarkBitMap)->mark((HeapWord*) p);
343 } 369 }
344 370
345 inline void ConcurrentMark::grayRoot(oop obj, size_t word_size, uint worker_id) { 371 inline void ConcurrentMark::grayRoot(oop obj, size_t word_size,
372 uint worker_id, HeapRegion* hr) {
373 assert(obj != NULL, "pre-condition");
346 HeapWord* addr = (HeapWord*) obj; 374 HeapWord* addr = (HeapWord*) obj;
347 375 if (hr == NULL) {
348 // Currently we don't do anything with word_size but we will use it 376 hr = _g1h->heap_region_containing_raw(addr);
349 // in the very near future in the liveness calculation piggy-backing 377 } else {
350 // changes. 378 assert(hr->is_in(addr), "pre-condition");
351 379 }
352 #ifdef ASSERT
353 HeapRegion* hr = _g1h->heap_region_containing(addr);
354 assert(hr != NULL, "sanity"); 380 assert(hr != NULL, "sanity");
355 assert(!hr->is_survivor(), "should not allocate survivors during IM"); 381 // Given that we're looking for a region that contains an object
356 assert(addr < hr->next_top_at_mark_start(), 382 // header it's impossible to get back a HC region.
357 err_msg("addr: "PTR_FORMAT" hr: "HR_FORMAT" NTAMS: "PTR_FORMAT, 383 assert(!hr->continuesHumongous(), "sanity");
358 addr, HR_FORMAT_PARAMS(hr), hr->next_top_at_mark_start())); 384
359 // We cannot assert that word_size == obj->size() given that obj 385 // We cannot assert that word_size == obj->size() given that obj
360 // might not be in a consistent state (another thread might be in 386 // might not be in a consistent state (another thread might be in
361 // the process of copying it). So the best thing we can do is to 387 // the process of copying it). So the best thing we can do is to
362 // assert that word_size is under an upper bound which is its 388 // assert that word_size is under an upper bound which is its
363 // containing region's capacity. 389 // containing region's capacity.
364 assert(word_size * HeapWordSize <= hr->capacity(), 390 assert(word_size * HeapWordSize <= hr->capacity(),
365 err_msg("size: "SIZE_FORMAT" capacity: "SIZE_FORMAT" "HR_FORMAT, 391 err_msg("size: "SIZE_FORMAT" capacity: "SIZE_FORMAT" "HR_FORMAT,
366 word_size * HeapWordSize, hr->capacity(), 392 word_size * HeapWordSize, hr->capacity(),
367 HR_FORMAT_PARAMS(hr))); 393 HR_FORMAT_PARAMS(hr)));
368 #endif // ASSERT 394
369 395 if (addr < hr->next_top_at_mark_start()) {
370 if (!_nextMarkBitMap->isMarked(addr)) { 396 if (!_nextMarkBitMap->isMarked(addr)) {
371 par_mark_and_count(obj, word_size, worker_id); 397 par_mark_and_count(obj, word_size, hr, worker_id);
398 }
372 } 399 }
373 } 400 }
374 401
375 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_CONCURRENTMARK_INLINE_HPP 402 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_CONCURRENTMARK_INLINE_HPP