diff --git a/src/hotspot/share/gc/parallel/parMarkBitMap.hpp b/src/hotspot/share/gc/parallel/parMarkBitMap.hpp index 63c4d4e7185..cedf7aca77c 100644 --- a/src/hotspot/share/gc/parallel/parMarkBitMap.hpp +++ b/src/hotspot/share/gc/parallel/parMarkBitMap.hpp @@ -31,8 +31,7 @@ class PSVirtualSpace; -class ParMarkBitMap: public CHeapObj -{ +class ParMarkBitMap: public CHeapObj { public: typedef BitMap::idx_t idx_t; @@ -46,9 +45,6 @@ public: inline bool mark_obj(HeapWord* addr); inline bool mark_obj(oop obj); - // Traditional interface for testing whether an object is marked or not (these - // test only the begin bits). - inline bool is_marked(idx_t bit) const; inline bool is_marked(HeapWord* addr) const; inline bool is_marked(oop obj) const; @@ -57,18 +53,13 @@ public: size_t reserved_byte_size() const { return _reserved_byte_size; } - // Convert a heap address to/from a bit index. - inline idx_t addr_to_bit(HeapWord* addr) const; - inline HeapWord* bit_to_addr(idx_t bit) const; - inline HeapWord* find_obj_beg(HeapWord* beg, HeapWord* end) const; // Return the address of the last obj-start in the range [beg, end). If no // object is found, return end. inline HeapWord* find_obj_beg_reverse(HeapWord* beg, HeapWord* end) const; - // Clear a range of bits or the entire bitmap (both begin and end bits are - // cleared). - inline void clear_range(idx_t beg, idx_t end); + // Clear a range of bits corresponding to heap address range [beg, end). + inline void clear_range(HeapWord* beg, HeapWord* end); void print_on_error(outputStream* st) const { st->print_cr("Marking Bits: (ParMarkBitMap*) " PTR_FORMAT, p2i(this)); @@ -111,6 +102,10 @@ private: inline size_t region_size() const; inline size_t size() const; + // Convert a heap address to/from a bit index. + inline idx_t addr_to_bit(HeapWord* addr) const; + inline HeapWord* bit_to_addr(idx_t bit) const; + #ifdef ASSERT inline void verify_bit(idx_t bit) const; inline void verify_addr(HeapWord* addr) const; diff --git a/src/hotspot/share/gc/parallel/parMarkBitMap.inline.hpp b/src/hotspot/share/gc/parallel/parMarkBitMap.inline.hpp index 6d4aba8e36f..07e2289fb0a 100644 --- a/src/hotspot/share/gc/parallel/parMarkBitMap.inline.hpp +++ b/src/hotspot/share/gc/parallel/parMarkBitMap.inline.hpp @@ -34,8 +34,10 @@ inline ParMarkBitMap::ParMarkBitMap(): _region_start(nullptr), _region_size(0), _beg_bits(), _virtual_space(nullptr), _reserved_byte_size(0) { } -inline void ParMarkBitMap::clear_range(idx_t beg, idx_t end) { - _beg_bits.clear_range(beg, end); +inline void ParMarkBitMap::clear_range(HeapWord* beg, HeapWord* end) { + const idx_t beg_bit = addr_to_bit(beg); + const idx_t end_bit = addr_to_bit(end); + _beg_bits.clear_range(beg_bit, end_bit); } inline ParMarkBitMap::idx_t ParMarkBitMap::bits_required(size_t words) { @@ -62,12 +64,8 @@ inline size_t ParMarkBitMap::size() const { return _beg_bits.size(); } -inline bool ParMarkBitMap::is_marked(idx_t bit) const { - return _beg_bits.at(bit); -} - inline bool ParMarkBitMap::is_marked(HeapWord* addr) const { - return is_marked(addr_to_bit(addr)); + return _beg_bits.at(addr_to_bit(addr)); } inline bool ParMarkBitMap::is_marked(oop obj) const { diff --git a/src/hotspot/share/gc/parallel/psParallelCompact.cpp b/src/hotspot/share/gc/parallel/psParallelCompact.cpp index e72fa42e6f6..4256be8870d 100644 --- a/src/hotspot/share/gc/parallel/psParallelCompact.cpp +++ b/src/hotspot/share/gc/parallel/psParallelCompact.cpp @@ -826,9 +826,7 @@ PSParallelCompact::clear_data_covering_space(SpaceId id) HeapWord* const top = space->top(); HeapWord* const max_top = MAX2(top, _space_info[id].new_top()); - const idx_t beg_bit = _mark_bitmap.addr_to_bit(bot); - const idx_t end_bit = _mark_bitmap.addr_to_bit(top); - _mark_bitmap.clear_range(beg_bit, end_bit); + _mark_bitmap.clear_range(bot, top); const size_t beg_region = _summary_data.addr_to_region_idx(bot); const size_t end_region = @@ -1001,10 +999,9 @@ void PSParallelCompact::fill_dense_prefix_end(SpaceId id) { return; } RegionData* const region_after_dense_prefix = _summary_data.addr_to_region_ptr(dense_prefix_end); - idx_t const dense_prefix_bit = _mark_bitmap.addr_to_bit(dense_prefix_end); if (region_after_dense_prefix->partial_obj_size() != 0 || - _mark_bitmap.is_marked(dense_prefix_bit)) { + _mark_bitmap.is_marked(dense_prefix_end)) { // The region after the dense prefix starts with live bytes. return; }