8339161: ZGC: Remove unused remembered sets

Reviewed-by: aboldtch, stefank
This commit is contained in:
Joel Sikström 2024-09-23 12:28:43 +00:00 committed by Stefan Karlsson
parent 384deda65f
commit 37ec80df8d
7 changed files with 29 additions and 95 deletions

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2015, 2023, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2015, 2024, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -248,8 +248,7 @@ void ZHeap::free_page(ZPage* page) {
_page_table.remove(page); _page_table.remove(page);
if (page->is_old()) { if (page->is_old()) {
page->verify_remset_cleared_current(); page->remset_delete();
page->verify_remset_cleared_previous();
} }
// Free page // Free page
@ -261,12 +260,10 @@ size_t ZHeap::free_empty_pages(const ZArray<ZPage*>* pages) {
// Remove page table entries // Remove page table entries
ZArrayIterator<ZPage*> iter(pages); ZArrayIterator<ZPage*> iter(pages);
for (ZPage* page; iter.next(&page);) { for (ZPage* page; iter.next(&page);) {
if (page->is_old()) {
// The remset of pages should be clean when installed into the page
// cache.
page->remset_clear();
}
_page_table.remove(page); _page_table.remove(page);
if (page->is_old()) {
page->remset_delete();
}
freed += page->size(); freed += page->size();
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2015, 2023, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2015, 2024, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -78,27 +78,16 @@ void ZPage::reset_seqnum() {
Atomic::store(&_seqnum_other, ZGeneration::generation(_generation_id == ZGenerationId::young ? ZGenerationId::old : ZGenerationId::young)->seqnum()); Atomic::store(&_seqnum_other, ZGeneration::generation(_generation_id == ZGenerationId::young ? ZGenerationId::old : ZGenerationId::young)->seqnum());
} }
void ZPage::remset_initialize() { void ZPage::remset_alloc() {
// Remsets should only be initialized once and only for old pages. // Remsets should only be allocated/initialized once and only for old pages.
assert(!_remembered_set.is_initialized(), "Should not be initialized"); assert(!_remembered_set.is_initialized(), "Should not be initialized");
assert(is_old(), "Only old pages need a remset"); assert(is_old(), "Only old pages need a remset");
_remembered_set.initialize(size()); _remembered_set.initialize(size());
} }
void ZPage::remset_initialize_or_verify_cleared() { void ZPage::remset_delete() {
assert(is_old(), "Only old pages need a remset"); _remembered_set.delete_all();
if (_remembered_set.is_initialized()) {
verify_remset_cleared_current();
verify_remset_cleared_previous();
} else {
remset_initialize();
}
}
void ZPage::remset_clear() {
_remembered_set.clear_all();
} }
void ZPage::reset(ZPageAge age) { void ZPage::reset(ZPageAge age) {
@ -123,7 +112,6 @@ void ZPage::reset_top_for_allocation() {
void ZPage::reset_type_and_size(ZPageType type) { void ZPage::reset_type_and_size(ZPageType type) {
_type = type; _type = type;
_livemap.resize(object_max_count()); _livemap.resize(object_max_count());
_remembered_set.resize(size());
} }
ZPage* ZPage::retype(ZPageType type) { ZPage* ZPage::retype(ZPageType type) {
@ -216,10 +204,6 @@ void ZPage::verify_remset_cleared_previous() const {
} }
} }
void ZPage::clear_remset_current() {
_remembered_set.clear_current();
}
void ZPage::clear_remset_previous() { void ZPage::clear_remset_previous() {
_remembered_set.clear_previous(); _remembered_set.clear_previous();
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2015, 2023, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2015, 2024, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -155,9 +155,8 @@ public:
void clear_remset_range_non_par_current(uintptr_t l_offset, size_t size); void clear_remset_range_non_par_current(uintptr_t l_offset, size_t size);
void swap_remset_bitmaps(); void swap_remset_bitmaps();
void remset_initialize(); void remset_alloc();
void remset_initialize_or_verify_cleared(); void remset_delete();
void remset_clear();
ZBitMap::ReverseIterator remset_reverse_iterator_previous(); ZBitMap::ReverseIterator remset_reverse_iterator_previous();
BitMap::Iterator remset_iterator_limited_current(uintptr_t l_offset, size_t size); BitMap::Iterator remset_iterator_limited_current(uintptr_t l_offset, size_t size);
@ -182,7 +181,6 @@ public:
void verify_remset_cleared_current() const; void verify_remset_cleared_current() const;
void verify_remset_cleared_previous() const; void verify_remset_cleared_previous() const;
void clear_remset_current();
void clear_remset_previous(); void clear_remset_previous();
void* remset_current(); void* remset_current();

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2015, 2023, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2015, 2024, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -733,7 +733,7 @@ retry:
page->reset_top_for_allocation(); page->reset_top_for_allocation();
page->reset_livemap(); page->reset_livemap();
if (age == ZPageAge::old) { if (age == ZPageAge::old) {
page->remset_initialize_or_verify_cleared(); page->remset_alloc();
} }
// Update allocation statistics. Exclude gc relocations to avoid // Update allocation statistics. Exclude gc relocations to avoid

View File

@ -848,7 +848,7 @@ private:
to_page->reset(to_age); to_page->reset(to_age);
to_page->reset_top_for_allocation(); to_page->reset_top_for_allocation();
if (promotion) { if (promotion) {
to_page->remset_initialize(); to_page->remset_alloc();
} }
// Verify that the inactive remset is clear when resetting the page for // Verify that the inactive remset is clear when resetting the page for
@ -943,35 +943,15 @@ public:
return ZGeneration::old()->active_remset_is_current(); return ZGeneration::old()->active_remset_is_current();
} }
void clear_remset_before_reuse(ZPage* page, bool in_place) { void clear_remset_before_in_place_reuse(ZPage* page) {
if (_forwarding->from_age() != ZPageAge::old) { if (_forwarding->from_age() != ZPageAge::old) {
// No remset bits // No remset bits
return; return;
} }
if (in_place) { // Clear 'previous' remset bits. For in-place relocated pages, the previous
// Clear 'previous' remset bits. For in-place relocated pages, the previous // remset bits are always used, even when active_remset_is_current().
// remset bits are always used, even when active_remset_is_current(). page->clear_remset_previous();
page->clear_remset_previous();
return;
}
// Normal relocate
// Clear active remset bits
if (active_remset_is_current()) {
page->clear_remset_current();
} else {
page->clear_remset_previous();
}
// Verify that inactive remset bits are all cleared
if (active_remset_is_current()) {
page->verify_remset_cleared_previous();
} else {
page->verify_remset_cleared_current();
}
} }
void finish_in_place_relocation() { void finish_in_place_relocation() {
@ -1017,7 +997,7 @@ public:
ZPage* const page = _forwarding->detach_page(); ZPage* const page = _forwarding->detach_page();
// Ensure that previous remset bits are cleared // Ensure that previous remset bits are cleared
clear_remset_before_reuse(page, true /* in_place */); clear_remset_before_in_place_reuse(page);
page->log_msg(" (relocate page done in-place)"); page->log_msg(" (relocate page done in-place)");
@ -1029,11 +1009,6 @@ public:
// Wait for all other threads to call release_page // Wait for all other threads to call release_page
ZPage* const page = _forwarding->detach_page(); ZPage* const page = _forwarding->detach_page();
// Ensure that all remset bits are cleared
// Note: cleared after detach_page, when we know that
// the young generation isn't scanning the remset.
clear_remset_before_reuse(page, false /* in_place */);
page->log_msg(" (relocate page done normal)"); page->log_msg(" (relocate page done normal)");
// Free page // Free page
@ -1292,7 +1267,7 @@ public:
new_page->reset(to_age); new_page->reset(to_age);
new_page->reset_livemap(); new_page->reset_livemap();
if (promotion) { if (promotion) {
new_page->remset_initialize(); new_page->remset_alloc();
} }
if (promotion) { if (promotion) {

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -55,18 +55,10 @@ void ZRememberedSet::initialize(size_t page_size) {
_bitmap[1].initialize(size_in_bits, true /* clear */); _bitmap[1].initialize(size_in_bits, true /* clear */);
} }
void ZRememberedSet::resize(size_t page_size) { void ZRememberedSet::delete_all() {
// The bitmaps only need to be resized if remset has been assert(is_initialized(), "precondition");
// initialized, and hence the bitmaps have been initialized. _bitmap[0].resize(0);
if (is_initialized()) { _bitmap[1].resize(0);
const BitMap::idx_t size_in_bits = to_bit_size(page_size);
// The bitmaps need to be cleared when free, but since this function is
// only used for shrinking the clear argument is correct but not crucial.
assert(size_in_bits <= _bitmap[0].size(), "Only used for shrinking");
_bitmap[0].resize(size_in_bits, true /* clear */);
_bitmap[1].resize(size_in_bits, true /* clear */);
}
} }
bool ZRememberedSet::is_cleared_current() const { bool ZRememberedSet::is_cleared_current() const {
@ -77,15 +69,6 @@ bool ZRememberedSet::is_cleared_previous() const {
return previous()->is_empty(); return previous()->is_empty();
} }
void ZRememberedSet::clear_all() {
_bitmap[0].clear_large();
_bitmap[1].clear_large();
}
void ZRememberedSet::clear_current() {
current()->clear_large();
}
void ZRememberedSet::clear_previous() { void ZRememberedSet::clear_previous() {
previous()->clear_large(); previous()->clear_large();
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -114,8 +114,7 @@ public:
bool is_initialized() const; bool is_initialized() const;
void initialize(size_t page_size); void initialize(size_t page_size);
void delete_all();
void resize(size_t page_size);
bool at_current(uintptr_t offset) const; bool at_current(uintptr_t offset) const;
bool at_previous(uintptr_t offset) const; bool at_previous(uintptr_t offset) const;
@ -133,8 +132,6 @@ public:
bool is_cleared_current() const; bool is_cleared_current() const;
bool is_cleared_previous() const; bool is_cleared_previous() const;
void clear_all();
void clear_current();
void clear_previous(); void clear_previous();
void swap_remset_bitmaps(); void swap_remset_bitmaps();