Path: blob/master/test/hotspot/jtreg/gc/arguments/TestObjectTenuringFlags.java
40942 views
/*1* Copyright (c) 2014, 2020, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/2223package gc.arguments;2425/*26* @test TestObjectTenuringFlags27* @bug 652137628* @requires vm.gc.Parallel29* @summary Tests argument processing for NeverTenure, AlwaysTenure,30* and MaxTenuringThreshold31* @library /test/lib32* @library /33* @modules java.base/jdk.internal.misc34* java.management35* @run driver gc.arguments.TestObjectTenuringFlags36*/3738import jdk.test.lib.process.OutputAnalyzer;39import jdk.test.lib.process.ProcessTools;4041import java.util.*;4243public class TestObjectTenuringFlags {44public static void main(String args[]) throws Exception {45// default case46runTenuringFlagsConsistencyTest(47new String[]{},48false /* shouldFail */,49new ExpectedTenuringFlags(false /* alwaysTenure */, false /* neverTenure */, 7, 15));5051// valid cases52runTenuringFlagsConsistencyTest(53new String[]{"-XX:+NeverTenure"},54false /* shouldFail */,55new ExpectedTenuringFlags(false /* alwaysTenure */, true /* neverTenure */, 7, 16));5657runTenuringFlagsConsistencyTest(58new String[]{"-XX:+AlwaysTenure"},59false /* shouldFail */,60new ExpectedTenuringFlags(true /* alwaysTenure */, false /* neverTenure */, 0, 0));6162runTenuringFlagsConsistencyTest(63new String[]{"-XX:MaxTenuringThreshold=0"},64false /* shouldFail */,65new ExpectedTenuringFlags(true /* alwaysTenure */, false /* neverTenure */, 0, 0));6667runTenuringFlagsConsistencyTest(68new String[]{"-XX:MaxTenuringThreshold=5"},69false /* shouldFail */,70new ExpectedTenuringFlags(false /* alwaysTenure */, false /* neverTenure */, 5, 5));7172runTenuringFlagsConsistencyTest(73new String[]{"-XX:MaxTenuringThreshold=10"},74false /* shouldFail */,75new ExpectedTenuringFlags(false /* alwaysTenure */, false /* neverTenure */, 7, 10));7677runTenuringFlagsConsistencyTest(78new String[]{"-XX:MaxTenuringThreshold=15"},79false /* shouldFail */,80new ExpectedTenuringFlags(false /* alwaysTenure */, false /* neverTenure */, 7, 15));8182runTenuringFlagsConsistencyTest(83new String[]{"-XX:MaxTenuringThreshold=16"},84false /* shouldFail */,85new ExpectedTenuringFlags(false /* alwaysTenure */, false /* neverTenure */, 7, 16));8687runTenuringFlagsConsistencyTest(88new String[]{"-XX:InitialTenuringThreshold=0"},89false /* shouldFail */,90new ExpectedTenuringFlags(false /* alwaysTenure */, false /* neverTenure */, 0, 15));9192runTenuringFlagsConsistencyTest(93new String[]{"-XX:InitialTenuringThreshold=5"},94false /* shouldFail */,95new ExpectedTenuringFlags(false /* alwaysTenure */, false /* neverTenure */, 5, 15));9697runTenuringFlagsConsistencyTest(98new String[]{"-XX:InitialTenuringThreshold=10"},99false /* shouldFail */,100new ExpectedTenuringFlags(false /* alwaysTenure */, false /* neverTenure */, 10, 15));101102runTenuringFlagsConsistencyTest(103new String[]{"-XX:InitialTenuringThreshold=15"},104false /* shouldFail */,105new ExpectedTenuringFlags(false /* alwaysTenure */, false /* neverTenure */, 15, 15));106107// "Last option wins" cases108runTenuringFlagsConsistencyTest(109new String[]{"-XX:+AlwaysTenure", "-XX:+NeverTenure"},110false /* shouldFail */,111new ExpectedTenuringFlags(false /* alwaysTenure */, true /* neverTenure */, 7, 16));112113runTenuringFlagsConsistencyTest(114new String[]{"-XX:+NeverTenure", "-XX:+AlwaysTenure"},115false /* shouldFail */,116new ExpectedTenuringFlags(true /* alwaysTenure */, false /* neverTenure */, 0, 0));117118runTenuringFlagsConsistencyTest(119new String[]{"-XX:MaxTenuringThreshold=16", "-XX:+AlwaysTenure"},120false /* shouldFail */,121new ExpectedTenuringFlags(true /* alwaysTenure */, false /* neverTenure */, 0, 0));122123runTenuringFlagsConsistencyTest(124new String[]{"-XX:+AlwaysTenure", "-XX:MaxTenuringThreshold=16"},125false /* shouldFail */,126new ExpectedTenuringFlags(false /* alwaysTenure */, false /* neverTenure */, 7, 16));127128runTenuringFlagsConsistencyTest(129new String[]{"-XX:MaxTenuringThreshold=0", "-XX:+NeverTenure"},130false /* shouldFail */,131new ExpectedTenuringFlags(false /* alwaysTenure */, true /* neverTenure */, 7, 16));132133runTenuringFlagsConsistencyTest(134new String[]{"-XX:+NeverTenure", "-XX:MaxTenuringThreshold=0"},135false /* shouldFail */,136new ExpectedTenuringFlags(true /* alwaysTenure */, false /* neverTenure */, 0, 0));137138// Illegal cases139runTenuringFlagsConsistencyTest(140new String[]{"-XX:MaxTenuringThreshold=17"},141true /* shouldFail */,142new ExpectedTenuringFlags());143144runTenuringFlagsConsistencyTest(145new String[]{"-XX:InitialTenuringThreshold=16"},146true /* shouldFail */,147new ExpectedTenuringFlags());148149runTenuringFlagsConsistencyTest(150new String[]{"-XX:InitialTenuringThreshold=17"},151true /* shouldFail */,152new ExpectedTenuringFlags());153}154155private static void runTenuringFlagsConsistencyTest(String[] tenuringFlags,156boolean shouldFail,157ExpectedTenuringFlags expectedFlags) throws Exception {158List<String> vmOpts = new ArrayList<>();159if (tenuringFlags.length > 0) {160Collections.addAll(vmOpts, tenuringFlags);161}162Collections.addAll(vmOpts, "-XX:+UseParallelGC", "-XX:+PrintFlagsFinal", "-version");163164ProcessBuilder pb = GCArguments.createJavaProcessBuilder(vmOpts);165OutputAnalyzer output = new OutputAnalyzer(pb.start());166167if (shouldFail) {168output.shouldHaveExitValue(1);169} else {170output.shouldHaveExitValue(0);171String stdout = output.getStdout();172checkTenuringFlagsConsistency(stdout, expectedFlags);173}174}175176private static void checkTenuringFlagsConsistency(String output, ExpectedTenuringFlags expectedFlags) {177if (expectedFlags.alwaysTenure != FlagsValue.getFlagBoolValue("AlwaysTenure", output)) {178throw new RuntimeException(179"Actual flag AlwaysTenure " + FlagsValue.getFlagBoolValue("AlwaysTenure", output) +180" is not equal to expected flag AlwaysTenure " + expectedFlags.alwaysTenure);181}182183if (expectedFlags.neverTenure != FlagsValue.getFlagBoolValue("NeverTenure", output)) {184throw new RuntimeException(185"Actual flag NeverTenure " + FlagsValue.getFlagBoolValue("NeverTenure", output) +186" is not equal to expected flag NeverTenure " + expectedFlags.neverTenure);187}188189if (expectedFlags.initialTenuringThreshold != FlagsValue.getFlagLongValue("InitialTenuringThreshold", output)) {190throw new RuntimeException(191"Actual flag InitialTenuringThreshold " + FlagsValue.getFlagLongValue("InitialTenuringThreshold", output) +192" is not equal to expected flag InitialTenuringThreshold " + expectedFlags.initialTenuringThreshold);193}194195if (expectedFlags.maxTenuringThreshold != FlagsValue.getFlagLongValue("MaxTenuringThreshold", output)) {196throw new RuntimeException(197"Actual flag MaxTenuringThreshold " + FlagsValue.getFlagLongValue("MaxTenuringThreshold", output) +198" is not equal to expected flag MaxTenuringThreshold " + expectedFlags.maxTenuringThreshold);199}200}201}202203class ExpectedTenuringFlags {204public boolean alwaysTenure;205public boolean neverTenure;206public long initialTenuringThreshold;207public long maxTenuringThreshold;208209public ExpectedTenuringFlags(boolean alwaysTenure,210boolean neverTenure,211long initialTenuringThreshold,212long maxTenuringThreshold) {213this.alwaysTenure = alwaysTenure;214this.neverTenure = neverTenure;215this.initialTenuringThreshold = initialTenuringThreshold;216this.maxTenuringThreshold = maxTenuringThreshold;217}218public ExpectedTenuringFlags() {}219}220221222