8219857: Shenandoah GC may initialize thread's gclab twice
Reviewed-by: rkennke
This commit is contained in:
parent
62dd12b386
commit
00b46c06a5
src/hotspot/share/gc/shenandoah
@ -482,7 +482,9 @@ void ShenandoahHeap::print_on(outputStream* st) const {
|
||||
class ShenandoahInitGCLABClosure : public ThreadClosure {
|
||||
public:
|
||||
void do_thread(Thread* thread) {
|
||||
if (thread != NULL && (thread->is_Java_thread() || thread->is_Worker_thread())) {
|
||||
assert(thread != NULL, "Sanity");
|
||||
assert(!thread->is_Java_thread(), "Don't expect JavaThread this early");
|
||||
if (thread->is_Worker_thread()) {
|
||||
ShenandoahThreadLocalData::initialize_gclab(thread);
|
||||
}
|
||||
}
|
||||
@ -494,8 +496,6 @@ void ShenandoahHeap::post_initialize() {
|
||||
|
||||
ShenandoahInitGCLABClosure init_gclabs;
|
||||
Threads::threads_do(&init_gclabs);
|
||||
_workers->threads_do(&init_gclabs);
|
||||
_safepoint_workers->threads_do(&init_gclabs);
|
||||
|
||||
// gclab can not be initialized early during VM startup, as it can not determinate its max_size.
|
||||
// Now, we will let WorkGang to initialize gclab when new worker is created.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2018, Red Hat, Inc. All rights reserved.
|
||||
* Copyright (c) 2018, 2019, Red Hat, Inc. All rights reserved.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
@ -122,6 +122,7 @@ public:
|
||||
|
||||
static void initialize_gclab(Thread* thread) {
|
||||
assert (thread->is_Java_thread() || thread->is_Worker_thread(), "Only Java and GC worker threads are allowed to get GCLABs");
|
||||
assert(data(thread)->_gclab == NULL, "Only initialize once");
|
||||
data(thread)->_gclab = new PLAB(PLAB::min_size());
|
||||
data(thread)->_gclab_size = 0;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user