Skip to content

Commit 969cb3c

Browse files
committed
8351167: ZGC: Lazily initialize livemap
1 parent 8073914 commit 969cb3c

File tree

4 files changed

+21
-5
lines changed

4 files changed

+21
-5
lines changed

src/hotspot/share/gc/z/zLiveMap.cpp

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,16 @@ ZLiveMap::ZLiveMap(uint32_t size)
4545
_live_bytes(0),
4646
_segment_live_bits(0),
4747
_segment_claim_bits(0),
48-
_bitmap(bitmap_size(size, NumSegments)),
48+
_bitmap_size(bitmap_size(size, NumSegments)),
49+
_bitmap(0),
4950
_segment_shift(log2i_exact(segment_size())) {}
5051

52+
void ZLiveMap::allocate_bitmap() {
53+
if (_bitmap.size() != _bitmap_size) {
54+
_bitmap.initialize(_bitmap_size, false /* clear */);
55+
}
56+
}
57+
5158
void ZLiveMap::reset(ZGenerationId id) {
5259
ZGeneration* const generation = ZGeneration::generation(id);
5360
const uint32_t seqnum_initializing = (uint32_t)-1;
@@ -64,6 +71,10 @@ void ZLiveMap::reset(ZGenerationId id) {
6471
_live_bytes = 0;
6572
_live_objects = 0;
6673

74+
// We lazily initialize the bitmap the first time the page is
75+
// marked, i.e. a bit is about to be set for the first time.
76+
allocate_bitmap();
77+
6778
// Clear segment claimed/live bits
6879
segment_live_bits().clear();
6980
segment_claim_bits().clear();
@@ -127,8 +138,10 @@ void ZLiveMap::reset_segment(BitMap::idx_t segment) {
127138

128139
void ZLiveMap::resize(uint32_t size) {
129140
const size_t new_bitmap_size = bitmap_size(size, NumSegments);
130-
if (_bitmap.size() != new_bitmap_size) {
141+
_bitmap_size = new_bitmap_size;
142+
_segment_shift = log2i_exact(segment_size());
143+
144+
if (_bitmap.size() != 0 && _bitmap.size() != new_bitmap_size) {
131145
_bitmap.reinitialize(new_bitmap_size, false /* clear */);
132-
_segment_shift = log2i_exact(segment_size());
133146
}
134147
}

src/hotspot/share/gc/z/zLiveMap.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ class ZLiveMap {
4242
volatile size_t _live_bytes;
4343
BitMap::bm_word_t _segment_live_bits;
4444
BitMap::bm_word_t _segment_claim_bits;
45+
size_t _bitmap_size;
4546
ZBitMap _bitmap;
4647
int _segment_shift;
4748

@@ -65,6 +66,8 @@ class ZLiveMap {
6566

6667
bool claim_segment(BitMap::idx_t segment);
6768

69+
void allocate_bitmap();
70+
6871
void reset(ZGenerationId id);
6972
void reset_segment(BitMap::idx_t segment);
7073

src/hotspot/share/gc/z/zLiveMap.inline.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ inline BitMap::idx_t ZLiveMap::next_live_segment(BitMap::idx_t segment) const {
8888
}
8989

9090
inline BitMap::idx_t ZLiveMap::segment_size() const {
91-
return _bitmap.size() / NumSegments;
91+
return _bitmap_size / NumSegments;
9292
}
9393

9494
inline BitMap::idx_t ZLiveMap::index_to_segment(BitMap::idx_t index) const {

src/hotspot/share/gc/z/zPage.inline.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ inline uint32_t ZPage::object_max_count() const {
7676
return 1;
7777

7878
default:
79-
return (uint32_t)(size() >> object_alignment_shift());
79+
return checked_cast<uint32_t>(size() >> object_alignment_shift());
8080
}
8181
}
8282

0 commit comments

Comments
 (0)