< 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 >