178 private:
179 // Each bit in the bitmap represents one unit of 'object granularity.' Objects
180 // are double-word aligned in 32-bit VMs, but not in 64-bit VMs, so the 32-bit
181 // granularity is 2, 64-bit is 1.
182 static inline size_t obj_granularity() { return size_t(MinObjAlignment); }
183
184 HeapWord* _region_start;
185 size_t _region_size;
186 BitMap _beg_bits;
187 BitMap _end_bits;
188 PSVirtualSpace* _virtual_space;
189
190 #ifndef PRODUCT
191 size_t _cas_tries;
192 size_t _cas_retries;
193 size_t _cas_by_another;
194 #endif // #ifndef PRODUCT
195 };
196
197 inline ParMarkBitMap::ParMarkBitMap():
198 _beg_bits(NULL, 0),
199 _end_bits(NULL, 0)
200 {
201 _region_start = 0;
202 _virtual_space = 0;
203 }
204
205 inline ParMarkBitMap::ParMarkBitMap(MemRegion covered_region):
206 _beg_bits(NULL, 0),
207 _end_bits(NULL, 0)
208 {
209 initialize(covered_region);
210 }
211
212 inline void ParMarkBitMap::clear_range(idx_t beg, idx_t end)
213 {
214 _beg_bits.clear_range(beg, end);
215 _end_bits.clear_range(beg, end);
216 }
217
218 inline ParMarkBitMap::idx_t
219 ParMarkBitMap::bits_required(size_t words)
220 {
221 // Need two bits (one begin bit, one end bit) for each unit of 'object
222 // granularity' in the heap.
223 return words_to_bits(words * 2);
224 }
225
226 inline ParMarkBitMap::idx_t
227 ParMarkBitMap::bits_required(MemRegion covered_region)
311 return words / obj_granularity();
312 }
313
314 inline size_t ParMarkBitMap::obj_size(idx_t beg_bit, idx_t end_bit) const
315 {
316 DEBUG_ONLY(verify_bit(beg_bit);)
317 DEBUG_ONLY(verify_bit(end_bit);)
318 return bits_to_words(end_bit - beg_bit + 1);
319 }
320
321 inline size_t
322 ParMarkBitMap::obj_size(HeapWord* beg_addr, HeapWord* end_addr) const
323 {
324 DEBUG_ONLY(verify_addr(beg_addr);)
325 DEBUG_ONLY(verify_addr(end_addr);)
326 return pointer_delta(end_addr, beg_addr) + obj_granularity();
327 }
328
329 inline size_t ParMarkBitMap::obj_size(idx_t beg_bit) const
330 {
331 const idx_t end_bit = _end_bits.find_next_one_bit(beg_bit, size());
332 assert(is_marked(beg_bit), "obj not marked");
333 assert(end_bit < size(), "end bit missing");
334 return obj_size(beg_bit, end_bit);
335 }
336
337 inline size_t ParMarkBitMap::obj_size(HeapWord* addr) const
338 {
339 return obj_size(addr_to_bit(addr));
340 }
341
342 inline size_t ParMarkBitMap::obj_size(oop obj) const
343 {
344 return obj_size((HeapWord*)obj);
345 }
346
347 inline ParMarkBitMap::IterationStatus
348 ParMarkBitMap::iterate(ParMarkBitMapClosure* live_closure,
349 HeapWord* range_beg,
350 HeapWord* range_end) const
351 {
370 return mark_obj((HeapWord*)obj, (size_t)size);
371 }
372
373 inline BitMap::idx_t
374 ParMarkBitMap::addr_to_bit(HeapWord* addr) const
375 {
376 DEBUG_ONLY(verify_addr(addr);)
377 return words_to_bits(pointer_delta(addr, region_start()));
378 }
379
380 inline HeapWord*
381 ParMarkBitMap::bit_to_addr(idx_t bit) const
382 {
383 DEBUG_ONLY(verify_bit(bit);)
384 return region_start() + bits_to_words(bit);
385 }
386
387 inline ParMarkBitMap::idx_t
388 ParMarkBitMap::find_obj_beg(idx_t beg, idx_t end) const
389 {
390 return _beg_bits.find_next_one_bit(beg, end);
391 }
392
393 inline ParMarkBitMap::idx_t
394 ParMarkBitMap::find_obj_end(idx_t beg, idx_t end) const
395 {
396 return _end_bits.find_next_one_bit(beg, end);
397 }
398
399 inline HeapWord*
400 ParMarkBitMap::find_obj_beg(HeapWord* beg, HeapWord* end) const
401 {
402 const idx_t beg_bit = addr_to_bit(beg);
403 const idx_t end_bit = addr_to_bit(end);
404 const idx_t search_end = BitMap::word_align_up(end_bit);
405 const idx_t res_bit = MIN2(find_obj_beg(beg_bit, search_end), end_bit);
406 return bit_to_addr(res_bit);
407 }
408
409 inline HeapWord*
410 ParMarkBitMap::find_obj_end(HeapWord* beg, HeapWord* end) const
411 {
412 const idx_t beg_bit = addr_to_bit(beg);
413 const idx_t end_bit = addr_to_bit(end);
414 const idx_t search_end = BitMap::word_align_up(end_bit);
415 const idx_t res_bit = MIN2(find_obj_end(beg_bit, search_end), end_bit);
416 return bit_to_addr(res_bit);
|
178 private:
179 // Each bit in the bitmap represents one unit of 'object granularity.' Objects
180 // are double-word aligned in 32-bit VMs, but not in 64-bit VMs, so the 32-bit
181 // granularity is 2, 64-bit is 1.
182 static inline size_t obj_granularity() { return size_t(MinObjAlignment); }
183
184 HeapWord* _region_start;
185 size_t _region_size;
186 BitMap _beg_bits;
187 BitMap _end_bits;
188 PSVirtualSpace* _virtual_space;
189
190 #ifndef PRODUCT
191 size_t _cas_tries;
192 size_t _cas_retries;
193 size_t _cas_by_another;
194 #endif // #ifndef PRODUCT
195 };
196
197 inline ParMarkBitMap::ParMarkBitMap():
198 _beg_bits(),
199 _end_bits()
200 {
201 _region_start = 0;
202 _virtual_space = 0;
203 }
204
205 inline ParMarkBitMap::ParMarkBitMap(MemRegion covered_region):
206 _beg_bits(),
207 _end_bits()
208 {
209 initialize(covered_region);
210 }
211
212 inline void ParMarkBitMap::clear_range(idx_t beg, idx_t end)
213 {
214 _beg_bits.clear_range(beg, end);
215 _end_bits.clear_range(beg, end);
216 }
217
218 inline ParMarkBitMap::idx_t
219 ParMarkBitMap::bits_required(size_t words)
220 {
221 // Need two bits (one begin bit, one end bit) for each unit of 'object
222 // granularity' in the heap.
223 return words_to_bits(words * 2);
224 }
225
226 inline ParMarkBitMap::idx_t
227 ParMarkBitMap::bits_required(MemRegion covered_region)
311 return words / obj_granularity();
312 }
313
314 inline size_t ParMarkBitMap::obj_size(idx_t beg_bit, idx_t end_bit) const
315 {
316 DEBUG_ONLY(verify_bit(beg_bit);)
317 DEBUG_ONLY(verify_bit(end_bit);)
318 return bits_to_words(end_bit - beg_bit + 1);
319 }
320
321 inline size_t
322 ParMarkBitMap::obj_size(HeapWord* beg_addr, HeapWord* end_addr) const
323 {
324 DEBUG_ONLY(verify_addr(beg_addr);)
325 DEBUG_ONLY(verify_addr(end_addr);)
326 return pointer_delta(end_addr, beg_addr) + obj_granularity();
327 }
328
329 inline size_t ParMarkBitMap::obj_size(idx_t beg_bit) const
330 {
331 const idx_t end_bit = _end_bits.get_next_one_offset_inline(beg_bit, size());
332 assert(is_marked(beg_bit), "obj not marked");
333 assert(end_bit < size(), "end bit missing");
334 return obj_size(beg_bit, end_bit);
335 }
336
337 inline size_t ParMarkBitMap::obj_size(HeapWord* addr) const
338 {
339 return obj_size(addr_to_bit(addr));
340 }
341
342 inline size_t ParMarkBitMap::obj_size(oop obj) const
343 {
344 return obj_size((HeapWord*)obj);
345 }
346
347 inline ParMarkBitMap::IterationStatus
348 ParMarkBitMap::iterate(ParMarkBitMapClosure* live_closure,
349 HeapWord* range_beg,
350 HeapWord* range_end) const
351 {
370 return mark_obj((HeapWord*)obj, (size_t)size);
371 }
372
373 inline BitMap::idx_t
374 ParMarkBitMap::addr_to_bit(HeapWord* addr) const
375 {
376 DEBUG_ONLY(verify_addr(addr);)
377 return words_to_bits(pointer_delta(addr, region_start()));
378 }
379
380 inline HeapWord*
381 ParMarkBitMap::bit_to_addr(idx_t bit) const
382 {
383 DEBUG_ONLY(verify_bit(bit);)
384 return region_start() + bits_to_words(bit);
385 }
386
387 inline ParMarkBitMap::idx_t
388 ParMarkBitMap::find_obj_beg(idx_t beg, idx_t end) const
389 {
390 return _beg_bits.get_next_one_offset_inline_aligned_right(beg, end);
391 }
392
393 inline ParMarkBitMap::idx_t
394 ParMarkBitMap::find_obj_end(idx_t beg, idx_t end) const
395 {
396 return _end_bits.get_next_one_offset_inline_aligned_right(beg, end);
397 }
398
399 inline HeapWord*
400 ParMarkBitMap::find_obj_beg(HeapWord* beg, HeapWord* end) const
401 {
402 const idx_t beg_bit = addr_to_bit(beg);
403 const idx_t end_bit = addr_to_bit(end);
404 const idx_t search_end = BitMap::word_align_up(end_bit);
405 const idx_t res_bit = MIN2(find_obj_beg(beg_bit, search_end), end_bit);
406 return bit_to_addr(res_bit);
407 }
408
409 inline HeapWord*
410 ParMarkBitMap::find_obj_end(HeapWord* beg, HeapWord* end) const
411 {
412 const idx_t beg_bit = addr_to_bit(beg);
413 const idx_t end_bit = addr_to_bit(end);
414 const idx_t search_end = BitMap::word_align_up(end_bit);
415 const idx_t res_bit = MIN2(find_obj_end(beg_bit, search_end), end_bit);
416 return bit_to_addr(res_bit);
|