Skip to content

Commit 37ec80d

Browse files
jsikstrostefank
authored andcommitted
8339161: ZGC: Remove unused remembered sets
Reviewed-by: aboldtch, stefank
1 parent 384deda commit 37ec80d

File tree

7 files changed

+28
-94
lines changed

7 files changed

+28
-94
lines changed

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

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2015, 2023, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2015, 2024, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -248,8 +248,7 @@ void ZHeap::free_page(ZPage* page) {
248248
_page_table.remove(page);
249249

250250
if (page->is_old()) {
251-
page->verify_remset_cleared_current();
252-
page->verify_remset_cleared_previous();
251+
page->remset_delete();
253252
}
254253

255254
// Free page
@@ -261,12 +260,10 @@ size_t ZHeap::free_empty_pages(const ZArray<ZPage*>* pages) {
261260
// Remove page table entries
262261
ZArrayIterator<ZPage*> iter(pages);
263262
for (ZPage* page; iter.next(&page);) {
263+
_page_table.remove(page);
264264
if (page->is_old()) {
265-
// The remset of pages should be clean when installed into the page
266-
// cache.
267-
page->remset_clear();
265+
page->remset_delete();
268266
}
269-
_page_table.remove(page);
270267
freed += page->size();
271268
}
272269

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

Lines changed: 5 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2015, 2023, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2015, 2024, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -78,27 +78,16 @@ void ZPage::reset_seqnum() {
7878
Atomic::store(&_seqnum_other, ZGeneration::generation(_generation_id == ZGenerationId::young ? ZGenerationId::old : ZGenerationId::young)->seqnum());
7979
}
8080

81-
void ZPage::remset_initialize() {
82-
// Remsets should only be initialized once and only for old pages.
81+
void ZPage::remset_alloc() {
82+
// Remsets should only be allocated/initialized once and only for old pages.
8383
assert(!_remembered_set.is_initialized(), "Should not be initialized");
8484
assert(is_old(), "Only old pages need a remset");
8585

8686
_remembered_set.initialize(size());
8787
}
8888

89-
void ZPage::remset_initialize_or_verify_cleared() {
90-
assert(is_old(), "Only old pages need a remset");
91-
92-
if (_remembered_set.is_initialized()) {
93-
verify_remset_cleared_current();
94-
verify_remset_cleared_previous();
95-
} else {
96-
remset_initialize();
97-
}
98-
}
99-
100-
void ZPage::remset_clear() {
101-
_remembered_set.clear_all();
89+
void ZPage::remset_delete() {
90+
_remembered_set.delete_all();
10291
}
10392

10493
void ZPage::reset(ZPageAge age) {
@@ -123,7 +112,6 @@ void ZPage::reset_top_for_allocation() {
123112
void ZPage::reset_type_and_size(ZPageType type) {
124113
_type = type;
125114
_livemap.resize(object_max_count());
126-
_remembered_set.resize(size());
127115
}
128116

129117
ZPage* ZPage::retype(ZPageType type) {
@@ -216,10 +204,6 @@ void ZPage::verify_remset_cleared_previous() const {
216204
}
217205
}
218206

219-
void ZPage::clear_remset_current() {
220-
_remembered_set.clear_current();
221-
}
222-
223207
void ZPage::clear_remset_previous() {
224208
_remembered_set.clear_previous();
225209
}

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

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2015, 2023, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2015, 2024, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -155,9 +155,8 @@ class ZPage : public CHeapObj<mtGC> {
155155
void clear_remset_range_non_par_current(uintptr_t l_offset, size_t size);
156156
void swap_remset_bitmaps();
157157

158-
void remset_initialize();
159-
void remset_initialize_or_verify_cleared();
160-
void remset_clear();
158+
void remset_alloc();
159+
void remset_delete();
161160

162161
ZBitMap::ReverseIterator remset_reverse_iterator_previous();
163162
BitMap::Iterator remset_iterator_limited_current(uintptr_t l_offset, size_t size);
@@ -182,7 +181,6 @@ class ZPage : public CHeapObj<mtGC> {
182181
void verify_remset_cleared_current() const;
183182
void verify_remset_cleared_previous() const;
184183

185-
void clear_remset_current();
186184
void clear_remset_previous();
187185

188186
void* remset_current();

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2015, 2023, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2015, 2024, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -733,7 +733,7 @@ ZPage* ZPageAllocator::alloc_page(ZPageType type, size_t size, ZAllocationFlags
733733
page->reset_top_for_allocation();
734734
page->reset_livemap();
735735
if (age == ZPageAge::old) {
736-
page->remset_initialize_or_verify_cleared();
736+
page->remset_alloc();
737737
}
738738

739739
// Update allocation statistics. Exclude gc relocations to avoid

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

Lines changed: 7 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -848,7 +848,7 @@ class ZRelocateWork : public StackObj {
848848
to_page->reset(to_age);
849849
to_page->reset_top_for_allocation();
850850
if (promotion) {
851-
to_page->remset_initialize();
851+
to_page->remset_alloc();
852852
}
853853

854854
// Verify that the inactive remset is clear when resetting the page for
@@ -943,35 +943,15 @@ class ZRelocateWork : public StackObj {
943943
return ZGeneration::old()->active_remset_is_current();
944944
}
945945

946-
void clear_remset_before_reuse(ZPage* page, bool in_place) {
946+
void clear_remset_before_in_place_reuse(ZPage* page) {
947947
if (_forwarding->from_age() != ZPageAge::old) {
948948
// No remset bits
949949
return;
950950
}
951951

952-
if (in_place) {
953-
// Clear 'previous' remset bits. For in-place relocated pages, the previous
954-
// remset bits are always used, even when active_remset_is_current().
955-
page->clear_remset_previous();
956-
957-
return;
958-
}
959-
960-
// Normal relocate
961-
962-
// Clear active remset bits
963-
if (active_remset_is_current()) {
964-
page->clear_remset_current();
965-
} else {
966-
page->clear_remset_previous();
967-
}
968-
969-
// Verify that inactive remset bits are all cleared
970-
if (active_remset_is_current()) {
971-
page->verify_remset_cleared_previous();
972-
} else {
973-
page->verify_remset_cleared_current();
974-
}
952+
// Clear 'previous' remset bits. For in-place relocated pages, the previous
953+
// remset bits are always used, even when active_remset_is_current().
954+
page->clear_remset_previous();
975955
}
976956

977957
void finish_in_place_relocation() {
@@ -1017,7 +997,7 @@ class ZRelocateWork : public StackObj {
1017997
ZPage* const page = _forwarding->detach_page();
1018998

1019999
// Ensure that previous remset bits are cleared
1020-
clear_remset_before_reuse(page, true /* in_place */);
1000+
clear_remset_before_in_place_reuse(page);
10211001

10221002
page->log_msg(" (relocate page done in-place)");
10231003

@@ -1029,11 +1009,6 @@ class ZRelocateWork : public StackObj {
10291009
// Wait for all other threads to call release_page
10301010
ZPage* const page = _forwarding->detach_page();
10311011

1032-
// Ensure that all remset bits are cleared
1033-
// Note: cleared after detach_page, when we know that
1034-
// the young generation isn't scanning the remset.
1035-
clear_remset_before_reuse(page, false /* in_place */);
1036-
10371012
page->log_msg(" (relocate page done normal)");
10381013

10391014
// Free page
@@ -1292,7 +1267,7 @@ class ZFlipAgePagesTask : public ZTask {
12921267
new_page->reset(to_age);
12931268
new_page->reset_livemap();
12941269
if (promotion) {
1295-
new_page->remset_initialize();
1270+
new_page->remset_alloc();
12961271
}
12971272

12981273
if (promotion) {

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

Lines changed: 5 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -55,18 +55,10 @@ void ZRememberedSet::initialize(size_t page_size) {
5555
_bitmap[1].initialize(size_in_bits, true /* clear */);
5656
}
5757

58-
void ZRememberedSet::resize(size_t page_size) {
59-
// The bitmaps only need to be resized if remset has been
60-
// initialized, and hence the bitmaps have been initialized.
61-
if (is_initialized()) {
62-
const BitMap::idx_t size_in_bits = to_bit_size(page_size);
63-
64-
// The bitmaps need to be cleared when free, but since this function is
65-
// only used for shrinking the clear argument is correct but not crucial.
66-
assert(size_in_bits <= _bitmap[0].size(), "Only used for shrinking");
67-
_bitmap[0].resize(size_in_bits, true /* clear */);
68-
_bitmap[1].resize(size_in_bits, true /* clear */);
69-
}
58+
void ZRememberedSet::delete_all() {
59+
assert(is_initialized(), "precondition");
60+
_bitmap[0].resize(0);
61+
_bitmap[1].resize(0);
7062
}
7163

7264
bool ZRememberedSet::is_cleared_current() const {
@@ -77,15 +69,6 @@ bool ZRememberedSet::is_cleared_previous() const {
7769
return previous()->is_empty();
7870
}
7971

80-
void ZRememberedSet::clear_all() {
81-
_bitmap[0].clear_large();
82-
_bitmap[1].clear_large();
83-
}
84-
85-
void ZRememberedSet::clear_current() {
86-
current()->clear_large();
87-
}
88-
8972
void ZRememberedSet::clear_previous() {
9073
previous()->clear_large();
9174
}

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

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -114,8 +114,7 @@ class ZRememberedSet {
114114

115115
bool is_initialized() const;
116116
void initialize(size_t page_size);
117-
118-
void resize(size_t page_size);
117+
void delete_all();
119118

120119
bool at_current(uintptr_t offset) const;
121120
bool at_previous(uintptr_t offset) const;
@@ -133,8 +132,6 @@ class ZRememberedSet {
133132
bool is_cleared_current() const;
134133
bool is_cleared_previous() const;
135134

136-
void clear_all();
137-
void clear_current();
138135
void clear_previous();
139136
void swap_remset_bitmaps();
140137

0 commit comments

Comments
 (0)