src/share/vm/gc_implementation/parallelScavenge/parMarkBitMap.hpp

Thu, 22 Sep 2011 10:57:37 -0700

author
johnc
date
Thu, 22 Sep 2011 10:57:37 -0700
changeset 3175
4dfb2df418f2
parent 2325
c760f78e0a53
child 3900
d2a62e0f25eb
permissions
-rw-r--r--

6484982: G1: process references during evacuation pauses
Summary: G1 now uses two reference processors - one is used by concurrent marking and the other is used by STW GCs (both full and incremental evacuation pauses). In an evacuation pause, the reference processor is embedded into the closures used to scan objects. Doing so causes causes reference objects to be 'discovered' by the reference processor. At the end of the evacuation pause, these discovered reference objects are processed - preserving (and copying) referent objects (and their reachable graphs) as appropriate.
Reviewed-by: ysr, jwilhelm, brutisso, stefank, tonyp

duke@435 1 /*
stefank@2314 2 * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
duke@435 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
duke@435 4 *
duke@435 5 * This code is free software; you can redistribute it and/or modify it
duke@435 6 * under the terms of the GNU General Public License version 2 only, as
duke@435 7 * published by the Free Software Foundation.
duke@435 8 *
duke@435 9 * This code is distributed in the hope that it will be useful, but WITHOUT
duke@435 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
duke@435 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
duke@435 12 * version 2 for more details (a copy is included in the LICENSE file that
duke@435 13 * accompanied this code).
duke@435 14 *
duke@435 15 * You should have received a copy of the GNU General Public License version
duke@435 16 * 2 along with this work; if not, write to the Free Software Foundation,
duke@435 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
duke@435 18 *
trims@1907 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
trims@1907 20 * or visit www.oracle.com if you need additional information or have any
trims@1907 21 * questions.
duke@435 22 *
duke@435 23 */
duke@435 24
stefank@2314 25 #ifndef SHARE_VM_GC_IMPLEMENTATION_PARALLELSCAVENGE_PARMARKBITMAP_HPP
stefank@2314 26 #define SHARE_VM_GC_IMPLEMENTATION_PARALLELSCAVENGE_PARMARKBITMAP_HPP
stefank@2314 27
stefank@2325 28 #include "memory/memRegion.hpp"
stefank@2314 29 #include "gc_implementation/parallelScavenge/psVirtualspace.hpp"
stefank@2314 30 #include "utilities/bitMap.inline.hpp"
stefank@2314 31
duke@435 32 class oopDesc;
duke@435 33 class ParMarkBitMapClosure;
duke@435 34
duke@435 35 class ParMarkBitMap: public CHeapObj
duke@435 36 {
duke@435 37 public:
duke@435 38 typedef BitMap::idx_t idx_t;
duke@435 39
duke@435 40 // Values returned by the iterate() methods.
duke@435 41 enum IterationStatus { incomplete, complete, full, would_overflow };
duke@435 42
duke@435 43 inline ParMarkBitMap();
duke@435 44 inline ParMarkBitMap(MemRegion covered_region);
duke@435 45 bool initialize(MemRegion covered_region);
duke@435 46
duke@435 47 // Atomically mark an object as live.
duke@435 48 bool mark_obj(HeapWord* addr, size_t size);
duke@435 49 inline bool mark_obj(oop obj, int size);
duke@435 50 inline bool mark_obj(oop obj);
duke@435 51
duke@435 52 // Return whether the specified begin or end bit is set.
duke@435 53 inline bool is_obj_beg(idx_t bit) const;
duke@435 54 inline bool is_obj_end(idx_t bit) const;
duke@435 55
duke@435 56 // Traditional interface for testing whether an object is marked or not (these
duke@435 57 // test only the begin bits).
duke@435 58 inline bool is_marked(idx_t bit) const;
duke@435 59 inline bool is_marked(HeapWord* addr) const;
duke@435 60 inline bool is_marked(oop obj) const;
duke@435 61
duke@435 62 inline bool is_unmarked(idx_t bit) const;
duke@435 63 inline bool is_unmarked(HeapWord* addr) const;
duke@435 64 inline bool is_unmarked(oop obj) const;
duke@435 65
duke@435 66 // Convert sizes from bits to HeapWords and back. An object that is n bits
duke@435 67 // long will be bits_to_words(n) words long. An object that is m words long
duke@435 68 // will take up words_to_bits(m) bits in the bitmap.
duke@435 69 inline static size_t bits_to_words(idx_t bits);
duke@435 70 inline static idx_t words_to_bits(size_t words);
duke@435 71
duke@435 72 // Return the size in words of an object given a begin bit and an end bit, or
duke@435 73 // the equivalent beg_addr and end_addr.
duke@435 74 inline size_t obj_size(idx_t beg_bit, idx_t end_bit) const;
duke@435 75 inline size_t obj_size(HeapWord* beg_addr, HeapWord* end_addr) const;
duke@435 76
duke@435 77 // Return the size in words of the object (a search is done for the end bit).
duke@435 78 inline size_t obj_size(idx_t beg_bit) const;
duke@435 79 inline size_t obj_size(HeapWord* addr) const;
duke@435 80 inline size_t obj_size(oop obj) const;
duke@435 81
duke@435 82 // Synonyms for the above.
duke@435 83 size_t obj_size_in_words(oop obj) const { return obj_size((HeapWord*)obj); }
duke@435 84 size_t obj_size_in_words(HeapWord* addr) const { return obj_size(addr); }
duke@435 85
duke@435 86 // Apply live_closure to each live object that lies completely within the
duke@435 87 // range [live_range_beg, live_range_end). This is used to iterate over the
duke@435 88 // compacted region of the heap. Return values:
duke@435 89 //
duke@435 90 // incomplete The iteration is not complete. The last object that
duke@435 91 // begins in the range does not end in the range;
duke@435 92 // closure->source() is set to the start of that object.
duke@435 93 //
duke@435 94 // complete The iteration is complete. All objects in the range
duke@435 95 // were processed and the closure is not full;
duke@435 96 // closure->source() is set one past the end of the range.
duke@435 97 //
duke@435 98 // full The closure is full; closure->source() is set to one
duke@435 99 // past the end of the last object processed.
duke@435 100 //
duke@435 101 // would_overflow The next object in the range would overflow the closure;
duke@435 102 // closure->source() is set to the start of that object.
duke@435 103 IterationStatus iterate(ParMarkBitMapClosure* live_closure,
duke@435 104 idx_t range_beg, idx_t range_end) const;
duke@435 105 inline IterationStatus iterate(ParMarkBitMapClosure* live_closure,
duke@435 106 HeapWord* range_beg,
duke@435 107 HeapWord* range_end) const;
duke@435 108
duke@435 109 // Apply live closure as above and additionally apply dead_closure to all dead
duke@435 110 // space in the range [range_beg, dead_range_end). Note that dead_range_end
duke@435 111 // must be >= range_end. This is used to iterate over the dense prefix.
duke@435 112 //
duke@435 113 // This method assumes that if the first bit in the range (range_beg) is not
duke@435 114 // marked, then dead space begins at that point and the dead_closure is
duke@435 115 // applied. Thus callers must ensure that range_beg is not in the middle of a
duke@435 116 // live object.
duke@435 117 IterationStatus iterate(ParMarkBitMapClosure* live_closure,
duke@435 118 ParMarkBitMapClosure* dead_closure,
duke@435 119 idx_t range_beg, idx_t range_end,
duke@435 120 idx_t dead_range_end) const;
duke@435 121 inline IterationStatus iterate(ParMarkBitMapClosure* live_closure,
duke@435 122 ParMarkBitMapClosure* dead_closure,
duke@435 123 HeapWord* range_beg,
duke@435 124 HeapWord* range_end,
duke@435 125 HeapWord* dead_range_end) const;
duke@435 126
duke@435 127 // Return the number of live words in the range [beg_addr, end_addr) due to
duke@435 128 // objects that start in the range. If a live object extends onto the range,
duke@435 129 // the caller must detect and account for any live words due to that object.
duke@435 130 // If a live object extends beyond the end of the range, only the words within
duke@435 131 // the range are included in the result.
duke@435 132 size_t live_words_in_range(HeapWord* beg_addr, HeapWord* end_addr) const;
duke@435 133
duke@435 134 // Same as the above, except the end of the range must be a live object, which
duke@435 135 // is the case when updating pointers. This allows a branch to be removed
duke@435 136 // from inside the loop.
duke@435 137 size_t live_words_in_range(HeapWord* beg_addr, oop end_obj) const;
duke@435 138
duke@435 139 inline HeapWord* region_start() const;
duke@435 140 inline HeapWord* region_end() const;
duke@435 141 inline size_t region_size() const;
duke@435 142 inline size_t size() const;
duke@435 143
duke@435 144 // Convert a heap address to/from a bit index.
duke@435 145 inline idx_t addr_to_bit(HeapWord* addr) const;
duke@435 146 inline HeapWord* bit_to_addr(idx_t bit) const;
duke@435 147
duke@435 148 // Return the bit index of the first marked object that begins (or ends,
duke@435 149 // respectively) in the range [beg, end). If no object is found, return end.
duke@435 150 inline idx_t find_obj_beg(idx_t beg, idx_t end) const;
duke@435 151 inline idx_t find_obj_end(idx_t beg, idx_t end) const;
duke@435 152
duke@435 153 inline HeapWord* find_obj_beg(HeapWord* beg, HeapWord* end) const;
duke@435 154 inline HeapWord* find_obj_end(HeapWord* beg, HeapWord* end) const;
duke@435 155
duke@435 156 // Clear a range of bits or the entire bitmap (both begin and end bits are
duke@435 157 // cleared).
duke@435 158 inline void clear_range(idx_t beg, idx_t end);
duke@435 159 inline void clear() { clear_range(0, size()); }
duke@435 160
duke@435 161 // Return the number of bits required to represent the specified number of
duke@435 162 // HeapWords, or the specified region.
duke@435 163 static inline idx_t bits_required(size_t words);
duke@435 164 static inline idx_t bits_required(MemRegion covered_region);
duke@435 165 static inline idx_t words_required(MemRegion covered_region);
duke@435 166
duke@435 167 #ifndef PRODUCT
duke@435 168 // CAS statistics.
duke@435 169 size_t cas_tries() { return _cas_tries; }
duke@435 170 size_t cas_retries() { return _cas_retries; }
duke@435 171 size_t cas_by_another() { return _cas_by_another; }
duke@435 172
duke@435 173 void reset_counters();
duke@435 174 #endif // #ifndef PRODUCT
duke@435 175
duke@435 176 #ifdef ASSERT
duke@435 177 void verify_clear() const;
duke@435 178 inline void verify_bit(idx_t bit) const;
duke@435 179 inline void verify_addr(HeapWord* addr) const;
duke@435 180 #endif // #ifdef ASSERT
duke@435 181
duke@435 182 private:
duke@435 183 // Each bit in the bitmap represents one unit of 'object granularity.' Objects
duke@435 184 // are double-word aligned in 32-bit VMs, but not in 64-bit VMs, so the 32-bit
duke@435 185 // granularity is 2, 64-bit is 1.
duke@435 186 static inline size_t obj_granularity() { return size_t(MinObjAlignment); }
jcoomes@1243 187 static inline int obj_granularity_shift() { return LogMinObjAlignment; }
duke@435 188
duke@435 189 HeapWord* _region_start;
duke@435 190 size_t _region_size;
duke@435 191 BitMap _beg_bits;
duke@435 192 BitMap _end_bits;
duke@435 193 PSVirtualSpace* _virtual_space;
duke@435 194
duke@435 195 #ifndef PRODUCT
duke@435 196 size_t _cas_tries;
duke@435 197 size_t _cas_retries;
duke@435 198 size_t _cas_by_another;
duke@435 199 #endif // #ifndef PRODUCT
duke@435 200 };
duke@435 201
duke@435 202 inline ParMarkBitMap::ParMarkBitMap():
ysr@777 203 _beg_bits(),
ysr@777 204 _end_bits()
duke@435 205 {
duke@435 206 _region_start = 0;
duke@435 207 _virtual_space = 0;
duke@435 208 }
duke@435 209
duke@435 210 inline ParMarkBitMap::ParMarkBitMap(MemRegion covered_region):
ysr@777 211 _beg_bits(),
ysr@777 212 _end_bits()
duke@435 213 {
duke@435 214 initialize(covered_region);
duke@435 215 }
duke@435 216
duke@435 217 inline void ParMarkBitMap::clear_range(idx_t beg, idx_t end)
duke@435 218 {
duke@435 219 _beg_bits.clear_range(beg, end);
duke@435 220 _end_bits.clear_range(beg, end);
duke@435 221 }
duke@435 222
duke@435 223 inline ParMarkBitMap::idx_t
duke@435 224 ParMarkBitMap::bits_required(size_t words)
duke@435 225 {
duke@435 226 // Need two bits (one begin bit, one end bit) for each unit of 'object
duke@435 227 // granularity' in the heap.
duke@435 228 return words_to_bits(words * 2);
duke@435 229 }
duke@435 230
duke@435 231 inline ParMarkBitMap::idx_t
duke@435 232 ParMarkBitMap::bits_required(MemRegion covered_region)
duke@435 233 {
duke@435 234 return bits_required(covered_region.word_size());
duke@435 235 }
duke@435 236
duke@435 237 inline ParMarkBitMap::idx_t
duke@435 238 ParMarkBitMap::words_required(MemRegion covered_region)
duke@435 239 {
duke@435 240 return bits_required(covered_region) / BitsPerWord;
duke@435 241 }
duke@435 242
duke@435 243 inline HeapWord*
duke@435 244 ParMarkBitMap::region_start() const
duke@435 245 {
duke@435 246 return _region_start;
duke@435 247 }
duke@435 248
duke@435 249 inline HeapWord*
duke@435 250 ParMarkBitMap::region_end() const
duke@435 251 {
duke@435 252 return region_start() + region_size();
duke@435 253 }
duke@435 254
duke@435 255 inline size_t
duke@435 256 ParMarkBitMap::region_size() const
duke@435 257 {
duke@435 258 return _region_size;
duke@435 259 }
duke@435 260
duke@435 261 inline size_t
duke@435 262 ParMarkBitMap::size() const
duke@435 263 {
duke@435 264 return _beg_bits.size();
duke@435 265 }
duke@435 266
duke@435 267 inline bool ParMarkBitMap::is_obj_beg(idx_t bit) const
duke@435 268 {
duke@435 269 return _beg_bits.at(bit);
duke@435 270 }
duke@435 271
duke@435 272 inline bool ParMarkBitMap::is_obj_end(idx_t bit) const
duke@435 273 {
duke@435 274 return _end_bits.at(bit);
duke@435 275 }
duke@435 276
duke@435 277 inline bool ParMarkBitMap::is_marked(idx_t bit) const
duke@435 278 {
duke@435 279 return is_obj_beg(bit);
duke@435 280 }
duke@435 281
duke@435 282 inline bool ParMarkBitMap::is_marked(HeapWord* addr) const
duke@435 283 {
duke@435 284 return is_marked(addr_to_bit(addr));
duke@435 285 }
duke@435 286
duke@435 287 inline bool ParMarkBitMap::is_marked(oop obj) const
duke@435 288 {
duke@435 289 return is_marked((HeapWord*)obj);
duke@435 290 }
duke@435 291
duke@435 292 inline bool ParMarkBitMap::is_unmarked(idx_t bit) const
duke@435 293 {
duke@435 294 return !is_marked(bit);
duke@435 295 }
duke@435 296
duke@435 297 inline bool ParMarkBitMap::is_unmarked(HeapWord* addr) const
duke@435 298 {
duke@435 299 return !is_marked(addr);
duke@435 300 }
duke@435 301
duke@435 302 inline bool ParMarkBitMap::is_unmarked(oop obj) const
duke@435 303 {
duke@435 304 return !is_marked(obj);
duke@435 305 }
duke@435 306
duke@435 307 inline size_t
duke@435 308 ParMarkBitMap::bits_to_words(idx_t bits)
duke@435 309 {
jcoomes@1243 310 return bits << obj_granularity_shift();
duke@435 311 }
duke@435 312
duke@435 313 inline ParMarkBitMap::idx_t
duke@435 314 ParMarkBitMap::words_to_bits(size_t words)
duke@435 315 {
jcoomes@1243 316 return words >> obj_granularity_shift();
duke@435 317 }
duke@435 318
duke@435 319 inline size_t ParMarkBitMap::obj_size(idx_t beg_bit, idx_t end_bit) const
duke@435 320 {
duke@435 321 DEBUG_ONLY(verify_bit(beg_bit);)
duke@435 322 DEBUG_ONLY(verify_bit(end_bit);)
duke@435 323 return bits_to_words(end_bit - beg_bit + 1);
duke@435 324 }
duke@435 325
duke@435 326 inline size_t
duke@435 327 ParMarkBitMap::obj_size(HeapWord* beg_addr, HeapWord* end_addr) const
duke@435 328 {
duke@435 329 DEBUG_ONLY(verify_addr(beg_addr);)
duke@435 330 DEBUG_ONLY(verify_addr(end_addr);)
duke@435 331 return pointer_delta(end_addr, beg_addr) + obj_granularity();
duke@435 332 }
duke@435 333
duke@435 334 inline size_t ParMarkBitMap::obj_size(idx_t beg_bit) const
duke@435 335 {
ysr@777 336 const idx_t end_bit = _end_bits.get_next_one_offset_inline(beg_bit, size());
duke@435 337 assert(is_marked(beg_bit), "obj not marked");
duke@435 338 assert(end_bit < size(), "end bit missing");
duke@435 339 return obj_size(beg_bit, end_bit);
duke@435 340 }
duke@435 341
duke@435 342 inline size_t ParMarkBitMap::obj_size(HeapWord* addr) const
duke@435 343 {
duke@435 344 return obj_size(addr_to_bit(addr));
duke@435 345 }
duke@435 346
duke@435 347 inline size_t ParMarkBitMap::obj_size(oop obj) const
duke@435 348 {
duke@435 349 return obj_size((HeapWord*)obj);
duke@435 350 }
duke@435 351
duke@435 352 inline ParMarkBitMap::IterationStatus
duke@435 353 ParMarkBitMap::iterate(ParMarkBitMapClosure* live_closure,
duke@435 354 HeapWord* range_beg,
duke@435 355 HeapWord* range_end) const
duke@435 356 {
duke@435 357 return iterate(live_closure, addr_to_bit(range_beg), addr_to_bit(range_end));
duke@435 358 }
duke@435 359
duke@435 360 inline ParMarkBitMap::IterationStatus
duke@435 361 ParMarkBitMap::iterate(ParMarkBitMapClosure* live_closure,
duke@435 362 ParMarkBitMapClosure* dead_closure,
duke@435 363 HeapWord* range_beg,
duke@435 364 HeapWord* range_end,
duke@435 365 HeapWord* dead_range_end) const
duke@435 366 {
duke@435 367 return iterate(live_closure, dead_closure,
duke@435 368 addr_to_bit(range_beg), addr_to_bit(range_end),
duke@435 369 addr_to_bit(dead_range_end));
duke@435 370 }
duke@435 371
duke@435 372 inline bool
duke@435 373 ParMarkBitMap::mark_obj(oop obj, int size)
duke@435 374 {
duke@435 375 return mark_obj((HeapWord*)obj, (size_t)size);
duke@435 376 }
duke@435 377
duke@435 378 inline BitMap::idx_t
duke@435 379 ParMarkBitMap::addr_to_bit(HeapWord* addr) const
duke@435 380 {
duke@435 381 DEBUG_ONLY(verify_addr(addr);)
duke@435 382 return words_to_bits(pointer_delta(addr, region_start()));
duke@435 383 }
duke@435 384
duke@435 385 inline HeapWord*
duke@435 386 ParMarkBitMap::bit_to_addr(idx_t bit) const
duke@435 387 {
duke@435 388 DEBUG_ONLY(verify_bit(bit);)
duke@435 389 return region_start() + bits_to_words(bit);
duke@435 390 }
duke@435 391
duke@435 392 inline ParMarkBitMap::idx_t
duke@435 393 ParMarkBitMap::find_obj_beg(idx_t beg, idx_t end) const
duke@435 394 {
ysr@777 395 return _beg_bits.get_next_one_offset_inline_aligned_right(beg, end);
duke@435 396 }
duke@435 397
duke@435 398 inline ParMarkBitMap::idx_t
duke@435 399 ParMarkBitMap::find_obj_end(idx_t beg, idx_t end) const
duke@435 400 {
ysr@777 401 return _end_bits.get_next_one_offset_inline_aligned_right(beg, end);
duke@435 402 }
duke@435 403
duke@435 404 inline HeapWord*
duke@435 405 ParMarkBitMap::find_obj_beg(HeapWord* beg, HeapWord* end) const
duke@435 406 {
duke@435 407 const idx_t beg_bit = addr_to_bit(beg);
duke@435 408 const idx_t end_bit = addr_to_bit(end);
duke@435 409 const idx_t search_end = BitMap::word_align_up(end_bit);
duke@435 410 const idx_t res_bit = MIN2(find_obj_beg(beg_bit, search_end), end_bit);
duke@435 411 return bit_to_addr(res_bit);
duke@435 412 }
duke@435 413
duke@435 414 inline HeapWord*
duke@435 415 ParMarkBitMap::find_obj_end(HeapWord* beg, HeapWord* end) const
duke@435 416 {
duke@435 417 const idx_t beg_bit = addr_to_bit(beg);
duke@435 418 const idx_t end_bit = addr_to_bit(end);
duke@435 419 const idx_t search_end = BitMap::word_align_up(end_bit);
duke@435 420 const idx_t res_bit = MIN2(find_obj_end(beg_bit, search_end), end_bit);
duke@435 421 return bit_to_addr(res_bit);
duke@435 422 }
duke@435 423
duke@435 424 #ifdef ASSERT
duke@435 425 inline void ParMarkBitMap::verify_bit(idx_t bit) const {
duke@435 426 // Allow one past the last valid bit; useful for loop bounds.
duke@435 427 assert(bit <= _beg_bits.size(), "bit out of range");
duke@435 428 }
duke@435 429
duke@435 430 inline void ParMarkBitMap::verify_addr(HeapWord* addr) const {
duke@435 431 // Allow one past the last valid address; useful for loop bounds.
duke@435 432 assert(addr >= region_start(), "addr too small");
duke@435 433 assert(addr <= region_start() + region_size(), "addr too big");
duke@435 434 }
duke@435 435 #endif // #ifdef ASSERT
stefank@2314 436
stefank@2314 437 #endif // SHARE_VM_GC_IMPLEMENTATION_PARALLELSCAVENGE_PARMARKBITMAP_HPP

mercurial