< prev index next >

test/hotspot/jtreg/runtime/cds/serviceability/ReplaceCriticalClasses.java

Print this page

*** 1,7 **** /* ! * Copyright (c) 2018, 2019, 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. --- 1,7 ---- /* ! * Copyright (c) 2018, 2020, 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.
*** 51,61 **** // Put the archive at separate file to avoid clashes with concurrent tests. CDSOptions opts = new CDSOptions() .setXShareMode("dump") .setArchiveName(ReplaceCriticalClasses.class.getName() + ".jsa") .setUseVersion(false) ! .addSuffix("-showversion"); CDSTestUtils.run(opts).assertNormalExit(""); launchChildProcesses(getTests()); } else if (args.length == 3 && args[0].equals("child")) { Class klass = Class.forName(args[2].replace("/", ".")); --- 51,62 ---- // Put the archive at separate file to avoid clashes with concurrent tests. CDSOptions opts = new CDSOptions() .setXShareMode("dump") .setArchiveName(ReplaceCriticalClasses.class.getName() + ".jsa") .setUseVersion(false) ! .addSuffix("-showversion") ! .addSuffix("-Xlog:cds"); CDSTestUtils.run(opts).assertNormalExit(""); launchChildProcesses(getTests()); } else if (args.length == 3 && args[0].equals("child")) { Class klass = Class.forName(args[2].replace("/", "."));
*** 78,101 **** // because JvmtiExport::early_class_hook_env() is true. "-early -notshared java/lang/Object", "-early -notshared java/lang/String", "-early -notshared java/lang/Cloneable", "-early -notshared java/io/Serializable", // CDS should not be disabled -- these critical classes cannot be replaced because // JvmtiExport::early_class_hook_env() is false. "java/lang/Object", "java/lang/String", "java/lang/Cloneable", "java/io/Serializable", ! ! /* Try to replace classes that are used by the archived subgraph graphs. ! The following test cases are in ReplaceCriticalClassesForSubgraphs.java. ! "-early -notshared -subgraph java/lang/module/ResolvedModule jdk.internal.module.ArchivedModuleGraph", ! "-early -notshared -subgraph java/lang/Long java.lang.Long$LongCache", ! "-subgraph java/lang/Long java.lang.Long$LongCache", ! */ // Replace classes that are loaded after JVMTI_PHASE_PRIMORDIAL. It's OK to replace // such // classes even when CDS is enabled. Nothing bad should happen. "-notshared java/util/Locale", --- 79,99 ---- // because JvmtiExport::early_class_hook_env() is true. "-early -notshared java/lang/Object", "-early -notshared java/lang/String", "-early -notshared java/lang/Cloneable", "-early -notshared java/io/Serializable", + "-early -notshared java/lang/Module", + "-early -notshared java/lang/ModuleLayer", // CDS should not be disabled -- these critical classes cannot be replaced because // JvmtiExport::early_class_hook_env() is false. "java/lang/Object", "java/lang/String", "java/lang/Cloneable", "java/io/Serializable", ! "java/lang/Module", ! "java/lang/ModuleLayer", // Replace classes that are loaded after JVMTI_PHASE_PRIMORDIAL. It's OK to replace // such // classes even when CDS is enabled. Nothing bad should happen. "-notshared java/util/Locale",
*** 114,137 **** } } static void launchChild(String args[]) throws Throwable { if (args.length < 1) { ! throw new RuntimeException("Invalid test case. Should be <-early> <-subgraph> <-notshared> klassName subgraphKlass"); } String klassName = null; String subgraphKlass = null; String early = ""; boolean subgraph = false; String shared = "-shared"; for (int i=0; i<args.length-1; i++) { String opt = args[i]; if (opt.equals("-early")) { early = "-early,"; } else if (opt.equals("-subgraph")) { subgraph = true; } else if (opt.equals("-notshared")) { shared = opt; } else { if (!subgraph) { throw new RuntimeException("Unknown option: " + opt); --- 112,138 ---- } } static void launchChild(String args[]) throws Throwable { if (args.length < 1) { ! throw new RuntimeException("Invalid test case. Should be <-early> <-subgraph> <-notshared> <-nowhitebox> klassName subgraphKlass"); } String klassName = null; String subgraphKlass = null; String early = ""; boolean subgraph = false; + boolean whitebox = true; String shared = "-shared"; for (int i=0; i<args.length-1; i++) { String opt = args[i]; if (opt.equals("-early")) { early = "-early,"; } else if (opt.equals("-subgraph")) { subgraph = true; + } else if (opt.equals("-nowhitebox")) { + whitebox = false; } else if (opt.equals("-notshared")) { shared = opt; } else { if (!subgraph) { throw new RuntimeException("Unknown option: " + opt);
*** 164,177 **** .setArchiveName(ReplaceCriticalClasses.class.getName() + ".jsa") .setUseVersion(false) .addSuffix("-showversion", "-Xlog:cds", "-XX:+UnlockDiagnosticVMOptions", ! agent, ! "-XX:+WhiteBoxAPI", "-Xbootclasspath/a:" + ClassFileInstaller.getJarPath("whitebox.jar")); ! if (subgraph) { opts.addSuffix("-Xlog:cds,cds+heap"); } opts.addSuffix("ReplaceCriticalClasses", --- 165,179 ---- .setArchiveName(ReplaceCriticalClasses.class.getName() + ".jsa") .setUseVersion(false) .addSuffix("-showversion", "-Xlog:cds", "-XX:+UnlockDiagnosticVMOptions", ! agent); ! if (whitebox) { ! opts.addSuffix("-XX:+WhiteBoxAPI", "-Xbootclasspath/a:" + ClassFileInstaller.getJarPath("whitebox.jar")); ! } if (subgraph) { opts.addSuffix("-Xlog:cds,cds+heap"); } opts.addSuffix("ReplaceCriticalClasses",
*** 189,216 **** } if (checkSubgraph) { if (expectShared) { if (!out.getOutput().contains("UseSharedSpaces: Unable to map at required address in java heap")) { out.shouldContain(subgraphInit); } } else { out.shouldNotContain(subgraphInit); } } }); } static void testInChild(boolean shouldBeShared, Class klass) { WhiteBox wb = WhiteBox.getWhiteBox(); if (shouldBeShared && !wb.isSharedClass(klass)) { throw new RuntimeException(klass + " should be shared but but actually is not."); } if (!shouldBeShared && wb.isSharedClass(klass)) { throw new RuntimeException(klass + " should not be shared but actually is."); } ! System.out.println("wb.isSharedClass(klass): " + wb.isSharedClass(klass) + " == " + shouldBeShared); String strings[] = { // interned strings from j.l.Object "@", "nanosecond timeout value out of range", --- 191,224 ---- } if (checkSubgraph) { if (expectShared) { if (!out.getOutput().contains("UseSharedSpaces: Unable to map at required address in java heap")) { out.shouldContain(subgraphInit); + // If the subgraph is successfully initialized, the specified shared class must not be rewritten. + out.shouldNotContain("Rewriting done."); } } else { out.shouldNotContain(subgraphInit); } } }); } static void testInChild(boolean shouldBeShared, Class klass) { + try { WhiteBox wb = WhiteBox.getWhiteBox(); if (shouldBeShared && !wb.isSharedClass(klass)) { throw new RuntimeException(klass + " should be shared but but actually is not."); } if (!shouldBeShared && wb.isSharedClass(klass)) { throw new RuntimeException(klass + " should not be shared but actually is."); } ! System.out.println("wb.isSharedClass(" + klass + "): " + wb.isSharedClass(klass) + " == " + shouldBeShared); ! } catch (UnsatisfiedLinkError e) { ! System.out.println("WhiteBox is disabled -- because test has -nowhitebox"); ! } String strings[] = { // interned strings from j.l.Object "@", "nanosecond timeout value out of range",
< prev index next >