Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

8325202: gc/g1/TestMarkStackOverflow.java intermittently crash: G1CMMarkStack::ChunkAllocator::allocate_new_chunk #17912

Closed
Closed
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions src/hotspot/share/gc/g1/g1ConcurrentMark.cpp
Original file line number Diff line number Diff line change
@@ -152,7 +152,7 @@ G1CMMarkStack::TaskQueueEntryChunk* G1CMMarkStack::ChunkAllocator::allocate_new_

MutexLocker x(MarkStackChunkList_lock, Mutex::_no_safepoint_check_flag);
if (Atomic::load_acquire(&_buckets[bucket]) == nullptr) {
size_t new_capacity = bucket_size(bucket) * 2;
size_t new_capacity = MIN2(bucket_size(bucket) * 2, _max_capacity);
if (!expand(new_capacity)) {
return nullptr;
}
@@ -213,9 +213,7 @@ bool G1CMMarkStack::ChunkAllocator::expand(size_t new_capacity) {
}

bool G1CMMarkStack::ChunkAllocator::expand() {
// Double capacity if possible.
size_t new_capacity = MIN2(_capacity * 2, _max_capacity);

return expand(new_capacity);
}

@@ -240,6 +238,9 @@ bool G1CMMarkStack::ChunkAllocator::reserve(size_t new_capacity) {
size_t highest_bucket = get_bucket(new_capacity - 1);
size_t i = get_bucket(_capacity);

// Allocate all buckets associated with indexes between the current capacity (_capacity)
// and the new capacity (new_capacity). This step ensures that there are no gaps in the
// array and that the capacity accurately reflects the reserved memory.
for (; i <= highest_bucket; i++) {
if (Atomic::load_acquire(&_buckets[i]) != nullptr) {
continue; // Skip over already allocated buckets.
5 changes: 3 additions & 2 deletions src/hotspot/share/gc/g1/g1ConcurrentMark.hpp
Original file line number Diff line number Diff line change
@@ -145,7 +145,7 @@ class G1CMMarkStack {
// within the bucket. Additionally, each new bucket added to the growable array doubles the capacity of
// the growable array.
//
// Illustration of the Growable Array data structure.
// Illustration of the growable array data structure.
//
// +----+ +----+----+
// | |------->| | |
@@ -174,7 +174,7 @@ class G1CMMarkStack {
size_t bucket_size(size_t bucket) {
return (bucket == 0) ?
_min_capacity :
_min_capacity * ( 1ULL << (bucket -1));
_min_capacity * ( 1ULL << (bucket - 1));
}

static unsigned int find_highest_bit(uintptr_t mask) {
@@ -225,6 +225,7 @@ class G1CMMarkStack {

size_t capacity() const { return _capacity; }

// Expand the mark stack doubling its size.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This one doesn't guarantee "expansion"; maybe try_expand to match its sibling.

bool expand();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
bool expand();
// Expand the mark stack doubling its size.
bool expand();

bool expand(size_t new_capacity);