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

8289137: Automatically adapt Young/OldPLABSize and when setting only MinTLABSize #9425

Closed
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
12 changes: 12 additions & 0 deletions src/hotspot/share/gc/shared/plab.cpp
Expand Up @@ -31,6 +31,7 @@
#include "logging/log.hpp"
#include "memory/universe.hpp"
#include "oops/oop.inline.hpp"
#include "runtime/globals_extension.hpp"

size_t PLAB::min_size() {
// Make sure that we return something that is larger than AlignmentReserve
Expand All @@ -41,6 +42,17 @@ size_t PLAB::max_size() {
return ThreadLocalAllocBuffer::max_size();
}

void PLAB::startup_initialization() {
if (!FLAG_IS_DEFAULT(MinTLABSize)) {
if (FLAG_IS_DEFAULT(YoungPLABSize)) {
FLAG_SET_ERGO(YoungPLABSize, MAX2(ThreadLocalAllocBuffer::min_size(), YoungPLABSize));
}
if (FLAG_IS_DEFAULT(OldPLABSize)) {
FLAG_SET_ERGO(OldPLABSize, MAX2(ThreadLocalAllocBuffer::min_size(), OldPLABSize));
}
}
}

PLAB::PLAB(size_t desired_plab_sz_) :
_word_sz(desired_plab_sz_), _bottom(NULL), _top(NULL),
_end(NULL), _hard_end(NULL), _allocated(0), _wasted(0), _undo_wasted(0)
Expand Down
4 changes: 3 additions & 1 deletion src/hotspot/share/gc/shared/plab.hpp
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2001, 2019, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2001, 2022, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
Expand Down Expand Up @@ -69,6 +69,8 @@ class PLAB: public CHeapObj<mtGC> {
void undo_last_allocation(HeapWord* obj, size_t word_sz);

public:
static void startup_initialization();

// Initializes the buffer to be empty, but with the given "word_sz".
// Must get initialized with "set_buf" for an allocation to succeed.
PLAB(size_t word_sz);
Expand Down
2 changes: 2 additions & 0 deletions src/hotspot/share/memory/universe.cpp
Expand Up @@ -43,6 +43,7 @@
#include "gc/shared/gcLogPrecious.hpp"
#include "gc/shared/gcTraceTime.inline.hpp"
#include "gc/shared/oopStorageSet.hpp"
#include "gc/shared/plab.hpp"
#include "gc/shared/stringdedup/stringDedup.hpp"
#include "gc/shared/tlab_globals.hpp"
#include "logging/log.hpp"
Expand Down Expand Up @@ -840,6 +841,7 @@ jint Universe::initialize_heap() {

void Universe::initialize_tlab() {
ThreadLocalAllocBuffer::set_max_size(Universe::heap()->max_tlab_size());
PLAB::startup_initialization();
if (UseTLAB) {
ThreadLocalAllocBuffer::startup_initialization();
}
Expand Down
77 changes: 77 additions & 0 deletions test/hotspot/jtreg/gc/TestPLABAdaptToMinTLABSize.java
@@ -0,0 +1,77 @@
/*
* Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* 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
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/

package gc.g1;

/*
* @test TestPLABAdaptToMinTLABSize
* @bug 8289137
* @summary Make sure that Young/OldPLABSize adapt to MinTLABSize setting.
* @library /test/lib
* @modules java.base/jdk.internal.misc
* java.management
* @run driver gc.g1.TestPLABAdaptToMinTLABSize
*/

import java.util.ArrayList;
import java.util.Collections;

import jdk.test.lib.process.OutputAnalyzer;
import jdk.test.lib.process.ProcessTools;

public class TestPLABAdaptToMinTLABSize {
private static void runTest(boolean shouldSucceed, String... extraArgs) throws Exception {
ArrayList<String> testArguments = new ArrayList<String>();
testArguments.add("-Xmx12m");
testArguments.add("-XX:+PrintFlagsFinal");
Collections.addAll(testArguments, extraArgs);
testArguments.add("-version");

ProcessBuilder pb = ProcessTools.createTestJvm(testArguments);

OutputAnalyzer output = new OutputAnalyzer(pb.start());

System.out.println(output.getStderr());

if (shouldSucceed) {
output.shouldHaveExitValue(0);

long oldPLABSize = Long.parseLong(output.firstMatch("OldPLABSize\\s+=\\s(\\d+)",1));
long youngPLABSize = Long.parseLong(output.firstMatch("YoungPLABSize\\s+=\\s(\\d+)",1));
long minTLABSize = Long.parseLong(output.firstMatch("MinTLABSize\\s+=\\s(\\d+)",1));

System.out.println("OldPLABSize=" + oldPLABSize + " YoungPLABSize=" + youngPLABSize +
"MinTLABSize=" + minTLABSize);

} else {
output.shouldNotHaveExitValue(0);
}
}

public static void main(String[] args) throws Exception {
runTest(true, "-XX:MinTLABSize=100k");
// Should not succeed when explicitly specifying invalid combination.
runTest(false, "-XX:MinTLABSize=100k", "-XX:OldPLABSize=5k");
runTest(false, "-XX:MinTLABSize=100k", "-XX:YoungPLABSize=5k");
}
}