src/share/vm/gc_implementation/g1/concurrentMark.inline.hpp

changeset 3463
d30fa85f9994
parent 3454
2e966d967c5c
child 3464
eff609af17d7
equal deleted inserted replaced
3462:877914d90c57 3463:d30fa85f9994
25 #ifndef SHARE_VM_GC_IMPLEMENTATION_G1_CONCURRENTMARK_INLINE_HPP 25 #ifndef SHARE_VM_GC_IMPLEMENTATION_G1_CONCURRENTMARK_INLINE_HPP
26 #define SHARE_VM_GC_IMPLEMENTATION_G1_CONCURRENTMARK_INLINE_HPP 26 #define SHARE_VM_GC_IMPLEMENTATION_G1_CONCURRENTMARK_INLINE_HPP
27 27
28 #include "gc_implementation/g1/concurrentMark.hpp" 28 #include "gc_implementation/g1/concurrentMark.hpp"
29 #include "gc_implementation/g1/g1CollectedHeap.inline.hpp" 29 #include "gc_implementation/g1/g1CollectedHeap.inline.hpp"
30
31 // Returns the index in the liveness accounting card bitmap
32 // for the given address
33 inline BitMap::idx_t ConcurrentMark::card_bitmap_index_for(HeapWord* addr) {
34 // Below, the term "card num" means the result of shifting an address
35 // by the card shift -- address 0 corresponds to card number 0. One
36 // must subtract the card num of the bottom of the heap to obtain a
37 // card table index.
38
39 intptr_t card_num = intptr_t(uintptr_t(addr) >> CardTableModRefBS::card_shift);
40 return card_num - heap_bottom_card_num();
41 }
42
43 // Counts the given memory region in the given task/worker
44 // counting data structures.
45 inline void ConcurrentMark::count_region(MemRegion mr, HeapRegion* hr,
46 size_t* marked_bytes_array,
47 BitMap* task_card_bm) {
48 G1CollectedHeap* g1h = _g1h;
49 HeapWord* start = mr.start();
50 HeapWord* last = mr.last();
51 size_t region_size_bytes = mr.byte_size();
52 size_t index = hr->hrs_index();
53
54 assert(!hr->continuesHumongous(), "should not be HC region");
55 assert(hr == g1h->heap_region_containing(start), "sanity");
56 assert(hr == g1h->heap_region_containing(mr.last()), "sanity");
57 assert(marked_bytes_array != NULL, "pre-condition");
58 assert(task_card_bm != NULL, "pre-condition");
59
60 // Add to the task local marked bytes for this region.
61 marked_bytes_array[index] += region_size_bytes;
62
63 BitMap::idx_t start_idx = card_bitmap_index_for(start);
64 BitMap::idx_t last_idx = card_bitmap_index_for(last);
65
66 // The card bitmap is task/worker specific => no need to use 'par' routines.
67 // Set bits in the inclusive bit range [start_idx, last_idx].
68 //
69 // For small ranges use a simple loop; otherwise use set_range
70 // The range are the cards that are spanned by the object/region
71 // so 8 cards will allow objects/regions up to 4K to be handled
72 // using the loop.
73 if ((last_idx - start_idx) <= 8) {
74 for (BitMap::idx_t i = start_idx; i <= last_idx; i += 1) {
75 task_card_bm->set_bit(i);
76 }
77 } else {
78 assert(last_idx < task_card_bm->size(), "sanity");
79 // Note: BitMap::set_range() is exclusive.
80 task_card_bm->set_range(start_idx, last_idx+1);
81 }
82 }
83
84 // Counts the given memory region, which may be a single object, in the
85 // task/worker counting data structures for the given worker id.
86 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();
90 HeapRegion* hr = _g1h->heap_region_containing_raw(addr);
91 count_region(mr, hr, marked_bytes_array, task_card_bm);
92 }
93
94 // Counts the given object in the given task/worker counting data structures.
95 inline void ConcurrentMark::count_object(oop obj,
96 HeapRegion* hr,
97 size_t* marked_bytes_array,
98 BitMap* task_card_bm) {
99 MemRegion mr((HeapWord*)obj, obj->size());
100 count_region(mr, hr, marked_bytes_array, task_card_bm);
101 }
102
103 // Counts the given object in the task/worker counting data
104 // structures for the given worker id.
105 inline void ConcurrentMark::count_object(oop obj, HeapRegion* hr, uint worker_id) {
106 size_t* marked_bytes_array = count_marked_bytes_array_for(worker_id);
107 BitMap* task_card_bm = count_card_bitmap_for(worker_id);
108 HeapWord* addr = (HeapWord*) obj;
109 count_object(obj, hr, marked_bytes_array, task_card_bm);
110 }
111
112 // Attempts to mark the given object and, if successful, counts
113 // the object in the given task/worker counting structures.
114 inline bool ConcurrentMark::par_mark_and_count(oop obj,
115 HeapRegion* hr,
116 size_t* marked_bytes_array,
117 BitMap* task_card_bm) {
118 HeapWord* addr = (HeapWord*)obj;
119 if (_nextMarkBitMap->parMark(addr)) {
120 // Update the task specific count data for the object.
121 count_object(obj, hr, marked_bytes_array, task_card_bm);
122 return true;
123 }
124 return false;
125 }
126
127 // Attempts to mark the given object and, if successful, counts
128 // the object in the task/worker counting structures for the
129 // given worker id.
130 inline bool ConcurrentMark::par_mark_and_count(oop obj,
131 HeapRegion* hr,
132 uint worker_id) {
133 HeapWord* addr = (HeapWord*)obj;
134 if (_nextMarkBitMap->parMark(addr)) {
135 // Update the task specific count data for the object.
136 count_object(obj, hr, worker_id);
137 return true;
138 }
139 return false;
140 }
141
142 // As above - but we don't know the heap region containing the
143 // object and so have to supply it.
144 inline bool ConcurrentMark::par_mark_and_count(oop obj, uint worker_id) {
145 HeapWord* addr = (HeapWord*)obj;
146 HeapRegion* hr = _g1h->heap_region_containing_raw(addr);
147 return par_mark_and_count(obj, hr, worker_id);
148 }
149
150 // Similar to the above routine but we already know the size, in words, of
151 // the object that we wish to mark/count
152 inline bool ConcurrentMark::par_mark_and_count(oop obj,
153 size_t word_size,
154 uint worker_id) {
155 HeapWord* addr = (HeapWord*)obj;
156 if (_nextMarkBitMap->parMark(addr)) {
157 // Update the task specific count data for the object.
158 MemRegion mr(addr, word_size);
159 count_region(mr, worker_id);
160 return true;
161 }
162 return false;
163 }
164
165 // Unconditionally mark the given object, and unconditinally count
166 // the object in the counting structures for worker id 0.
167 // Should *not* be called from parallel code.
168 inline bool ConcurrentMark::mark_and_count(oop obj, HeapRegion* hr) {
169 HeapWord* addr = (HeapWord*)obj;
170 _nextMarkBitMap->mark(addr);
171 // Update the task specific count data for the object.
172 count_object(obj, hr, 0 /* worker_id */);
173 return true;
174 }
175
176 // As above - but we don't have the heap region containing the
177 // object, so we have to supply it.
178 inline bool ConcurrentMark::mark_and_count(oop obj) {
179 HeapWord* addr = (HeapWord*)obj;
180 HeapRegion* hr = _g1h->heap_region_containing_raw(addr);
181 return mark_and_count(obj, hr);
182 }
30 183
31 inline bool CMBitMapRO::iterate(BitMapClosure* cl, MemRegion mr) { 184 inline bool CMBitMapRO::iterate(BitMapClosure* cl, MemRegion mr) {
32 HeapWord* start_addr = MAX2(startWord(), mr.start()); 185 HeapWord* start_addr = MAX2(startWord(), mr.start());
33 HeapWord* end_addr = MIN2(endWord(), mr.end()); 186 HeapWord* end_addr = MIN2(endWord(), mr.end());
34 187
111 264
112 ++_refs_reached; 265 ++_refs_reached;
113 266
114 HeapWord* objAddr = (HeapWord*) obj; 267 HeapWord* objAddr = (HeapWord*) obj;
115 assert(obj->is_oop_or_null(true /* ignore mark word */), "Error"); 268 assert(obj->is_oop_or_null(true /* ignore mark word */), "Error");
116 if (_g1h->is_in_g1_reserved(objAddr)) { 269 if (_g1h->is_in_g1_reserved(objAddr)) {
117 assert(obj != NULL, "null check is implicit"); 270 assert(obj != NULL, "null check is implicit");
118 if (!_nextMarkBitMap->isMarked(objAddr)) { 271 if (!_nextMarkBitMap->isMarked(objAddr)) {
119 // Only get the containing region if the object is not marked on the 272 // Only get the containing region if the object is not marked on the
120 // bitmap (otherwise, it's a waste of time since we won't do 273 // bitmap (otherwise, it's a waste of time since we won't do
121 // anything with it). 274 // anything with it).
125 gclog_or_tty->print_cr("[%d] "PTR_FORMAT" is not considered marked", 278 gclog_or_tty->print_cr("[%d] "PTR_FORMAT" is not considered marked",
126 _task_id, (void*) obj); 279 _task_id, (void*) obj);
127 } 280 }
128 281
129 // we need to mark it first 282 // we need to mark it first
130 if (_nextMarkBitMap->parMark(objAddr)) { 283 if (_cm->par_mark_and_count(obj, hr, _marked_bytes_array, _card_bm)) {
131 // No OrderAccess:store_load() is needed. It is implicit in the 284 // No OrderAccess:store_load() is needed. It is implicit in the
132 // CAS done in parMark(objAddr) above 285 // CAS done in CMBitMap::parMark() call in the routine above.
133 HeapWord* global_finger = _cm->finger(); 286 HeapWord* global_finger = _cm->finger();
134 287
135 #if _CHECK_BOTH_FINGERS_ 288 #if _CHECK_BOTH_FINGERS_
136 // we will check both the local and global fingers 289 // we will check both the local and global fingers
137 290
187 // Note we are overriding the read-only view of the prev map here, via 340 // Note we are overriding the read-only view of the prev map here, via
188 // the cast. 341 // the cast.
189 ((CMBitMap*)_prevMarkBitMap)->mark((HeapWord*) p); 342 ((CMBitMap*)_prevMarkBitMap)->mark((HeapWord*) p);
190 } 343 }
191 344
192 inline void ConcurrentMark::markNext(oop p) { 345 inline void ConcurrentMark::grayRoot(oop obj, size_t word_size, uint worker_id) {
193 assert(!_nextMarkBitMap->isMarked((HeapWord*) p), "sanity");
194 _nextMarkBitMap->mark((HeapWord*) p);
195 }
196
197 inline void ConcurrentMark::grayRoot(oop obj, size_t word_size) {
198 HeapWord* addr = (HeapWord*) obj; 346 HeapWord* addr = (HeapWord*) obj;
199 347
200 // Currently we don't do anything with word_size but we will use it 348 // Currently we don't do anything with word_size but we will use it
201 // in the very near future in the liveness calculation piggy-backing 349 // in the very near future in the liveness calculation piggy-backing
202 // changes. 350 // changes.
218 word_size * HeapWordSize, hr->capacity(), 366 word_size * HeapWordSize, hr->capacity(),
219 HR_FORMAT_PARAMS(hr))); 367 HR_FORMAT_PARAMS(hr)));
220 #endif // ASSERT 368 #endif // ASSERT
221 369
222 if (!_nextMarkBitMap->isMarked(addr)) { 370 if (!_nextMarkBitMap->isMarked(addr)) {
223 _nextMarkBitMap->parMark(addr); 371 par_mark_and_count(obj, word_size, worker_id);
224 } 372 }
225 } 373 }
226 374
227 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_CONCURRENTMARK_INLINE_HPP 375 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_CONCURRENTMARK_INLINE_HPP

mercurial