Skip to content

Commit 1692fd2

Browse files
Thomas SchatzlIvan Walulya
andcommitted
8017163: G1: Refactor remembered sets
8048504: G1: Investigate replacing the coarse and fine grained data structures in the remembered sets 6949259: G1: Merge sparse and fine remembered set hash tables Co-authored-by: Ivan Walulya <iwalulya@openjdk.org> Co-authored-by: Thomas Schatzl <tschatzl@openjdk.org> Reviewed-by: sjohanss, iwalulya
1 parent 0b8a0e2 commit 1692fd2

File tree

64 files changed

+4793
-1575
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

64 files changed

+4793
-1575
lines changed

src/hotspot/share/gc/g1/g1Arguments.cpp

Lines changed: 51 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525

2626
#include "precompiled.hpp"
2727
#include "gc/g1/g1Arguments.hpp"
28+
#include "gc/g1/g1CardSet.hpp"
29+
#include "gc/g1/g1CardSetContainers.inline.hpp"
2830
#include "gc/g1/g1CollectedHeap.inline.hpp"
2931
#include "gc/g1/g1HeapVerifier.hpp"
3032
#include "gc/g1/heapRegion.hpp"
@@ -50,16 +52,17 @@ void G1Arguments::initialize_alignments() {
5052
// around this we use the unaligned values for the heap.
5153
HeapRegion::setup_heap_region_size(MaxHeapSize);
5254

53-
// The remembered set needs the heap regions set up.
54-
HeapRegionRemSet::setup_remset_size();
55+
SpaceAlignment = HeapRegion::GrainBytes;
56+
HeapAlignment = calculate_heap_alignment(SpaceAlignment);
57+
58+
// We need to initialize card set configuration as soon as heap region size is
59+
// known as it depends on it and is used really early.
60+
initialize_card_set_configuration();
5561
// Needs remembered set initialization as the ergonomics are based
5662
// on it.
5763
if (FLAG_IS_DEFAULT(G1EagerReclaimRemSetThreshold)) {
58-
FLAG_SET_ERGO(G1EagerReclaimRemSetThreshold, G1RSetSparseRegionEntries);
64+
FLAG_SET_ERGO(G1EagerReclaimRemSetThreshold, G1RemSetArrayOfCardsEntries);
5965
}
60-
61-
SpaceAlignment = HeapRegion::GrainBytes;
62-
HeapAlignment = calculate_heap_alignment(SpaceAlignment);
6366
}
6467

6568
size_t G1Arguments::conservative_max_heap_alignment() {
@@ -119,6 +122,40 @@ void G1Arguments::initialize_mark_stack_size() {
119122
log_trace(gc)("MarkStackSize: %uk MarkStackSizeMax: %uk", (uint)(MarkStackSize / K), (uint)(MarkStackSizeMax / K));
120123
}
121124

125+
126+
void G1Arguments::initialize_card_set_configuration() {
127+
assert(HeapRegion::LogOfHRGrainBytes != 0, "not initialized");
128+
// Array of Cards card set container globals.
129+
const int LOG_M = 20;
130+
uint region_size_log_mb = (uint)MAX2(HeapRegion::LogOfHRGrainBytes - LOG_M, 0);
131+
132+
if (FLAG_IS_DEFAULT(G1RemSetArrayOfCardsEntries)) {
133+
uint num_cards_in_inline_ptr = G1CardSetConfiguration::num_cards_in_inline_ptr(HeapRegion::LogOfHRGrainBytes - CardTable::card_shift);
134+
FLAG_SET_ERGO(G1RemSetArrayOfCardsEntries, MAX2(num_cards_in_inline_ptr * 2,
135+
G1RemSetArrayOfCardsEntriesBase * (1u << (region_size_log_mb + 1))));
136+
}
137+
138+
// Round to next 8 byte boundary for array to maximize space usage.
139+
size_t const cur_size = G1CardSetArray::size_in_bytes(G1RemSetArrayOfCardsEntries);
140+
FLAG_SET_ERGO(G1RemSetArrayOfCardsEntries,
141+
G1RemSetArrayOfCardsEntries + (uint)(align_up(cur_size, G1CardSetAllocOptions::BufferAlignment) - cur_size) / sizeof(G1CardSetArray::EntryDataType));
142+
143+
// Howl card set container globals.
144+
if (FLAG_IS_DEFAULT(G1RemSetHowlNumBuckets)) {
145+
FLAG_SET_ERGO(G1RemSetHowlNumBuckets, G1CardSetHowl::num_buckets(HeapRegion::CardsPerRegion,
146+
G1RemSetArrayOfCardsEntries,
147+
G1RemSetHowlMaxNumBuckets));
148+
}
149+
150+
if (FLAG_IS_DEFAULT(G1RemSetHowlMaxNumBuckets)) {
151+
FLAG_SET_ERGO(G1RemSetHowlMaxNumBuckets, MAX2(G1RemSetHowlMaxNumBuckets, G1RemSetHowlNumBuckets));
152+
} else if (G1RemSetHowlMaxNumBuckets < G1RemSetHowlNumBuckets) {
153+
FormatBuffer<> buf("Maximum Howl card set container bucket size %u smaller than requested bucket size %u",
154+
G1RemSetHowlMaxNumBuckets, G1RemSetHowlNumBuckets);
155+
vm_exit_during_initialization(buf);
156+
}
157+
}
158+
122159
void G1Arguments::initialize() {
123160
GCArguments::initialize();
124161
assert(UseG1GC, "Error");
@@ -196,6 +233,14 @@ void G1Arguments::initialize() {
196233

197234
initialize_mark_stack_size();
198235
initialize_verification_types();
236+
237+
// Verify that the maximum parallelism isn't too high to eventually overflow
238+
// the refcount in G1CardSetContainer.
239+
uint max_parallel_refinement_threads = G1ConcRefinementThreads + G1DirtyCardQueueSet::num_par_ids();
240+
uint const divisor = 3; // Safe divisor; we increment by 2 for each claim, but there is a small initial value.
241+
if (max_parallel_refinement_threads > UINTPTR_MAX / divisor) {
242+
vm_exit_during_initialization("Too large parallelism for remembered sets.");
243+
}
199244
}
200245

201246
void G1Arguments::initialize_heap_flags_and_sizes() {

src/hotspot/share/gc/g1/g1Arguments.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ class G1Arguments : public GCArguments {
3434
friend class G1HeapVerifierTest;
3535

3636
static void initialize_mark_stack_size();
37+
static void initialize_card_set_configuration();
3738
static void initialize_verification_types();
3839
static void parse_verification_type(const char* type);
3940

0 commit comments

Comments
 (0)