Skip to content

Commit 1cb2cc6

Browse files
committed
8308464: Shared array class should not always be loaded in boot loader
Reviewed-by: dholmes, iklam
1 parent 69d1feb commit 1cb2cc6

File tree

4 files changed

+32
-15
lines changed

4 files changed

+32
-15
lines changed

src/hotspot/share/oops/arrayKlass.cpp

-1
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,6 @@ void ArrayKlass::remove_java_mirror() {
175175
}
176176

177177
void ArrayKlass::restore_unshareable_info(ClassLoaderData* loader_data, Handle protection_domain, TRAPS) {
178-
assert(loader_data == ClassLoaderData::the_null_class_loader_data(), "array classes belong to null loader");
179178
Klass::restore_unshareable_info(loader_data, protection_domain, CHECK);
180179
// Klass recreates the component mirror also
181180

src/hotspot/share/oops/instanceKlass.cpp

+3-2
Original file line numberDiff line numberDiff line change
@@ -2703,10 +2703,11 @@ void InstanceKlass::restore_unshareable_info(ClassLoaderData* loader_data, Handl
27032703
if (array_klasses() != nullptr) {
27042704
// To get a consistent list of classes we need MultiArray_lock to ensure
27052705
// array classes aren't observed while they are being restored.
2706-
MutexLocker ml(MultiArray_lock);
2706+
MutexLocker ml(MultiArray_lock);
2707+
assert(this == array_klasses()->bottom_klass(), "sanity");
27072708
// Array classes have null protection domain.
27082709
// --> see ArrayKlass::complete_create_array_klass()
2709-
array_klasses()->restore_unshareable_info(ClassLoaderData::the_null_class_loader_data(), Handle(), CHECK);
2710+
array_klasses()->restore_unshareable_info(class_loader_data(), Handle(), CHECK);
27102711
}
27112712

27122713
// Initialize @ValueBased class annotation

src/hotspot/share/oops/klass.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -570,7 +570,9 @@ void Klass::restore_unshareable_info(ClassLoaderData* loader_data, Handle protec
570570
JFR_ONLY(RESTORE_ID(this);)
571571
if (log_is_enabled(Trace, cds, unshareable)) {
572572
ResourceMark rm(THREAD);
573-
log_trace(cds, unshareable)("restore: %s", external_name());
573+
oop class_loader = loader_data->class_loader();
574+
log_trace(cds, unshareable)("restore: %s with class loader: %s", external_name(),
575+
class_loader != nullptr ? class_loader->klass()->external_name() : "boot");
574576
}
575577

576578
// If an exception happened during CDS restore, some of these fields may already be

test/hotspot/jtreg/runtime/cds/appcds/dynamicArchive/ArrayKlasses.java

+26-11
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,10 @@ public static void main(String[] args) throws Exception {
4444

4545
static void test() throws Exception {
4646
String topArchiveName = getNewArchiveName();
47-
String appJar = ClassFileInstaller.getJarPath("ArrayKlasses.jar");
48-
String mainClass = "ArrayKlassesApp";
47+
final String appJar = ClassFileInstaller.getJarPath("ArrayKlasses.jar");
48+
final String mainClass = "ArrayKlassesApp";
49+
final String runtimeLogOptions =
50+
"-Xlog:class+load,class+load+array=debug,cds+dynamic=debug,cds=debug,cds+unshareable=trace";
4951

5052
// Case 1
5153
// Create a dynamic archive with the ArrayKlassesApp app class and its
@@ -62,14 +64,17 @@ static void test() throws Exception {
6264
// Case 1
6365
// At runtime , the ArrayKlasesApp and its array class should be loaded
6466
// from the dynamic archive.
65-
run2(null, topArchiveName,
66-
"-Xlog:class+load,class+load+array=debug,cds+dynamic=debug,cds=debug",
67+
run2(null, topArchiveName, runtimeLogOptions,
6768
"-cp", appJar, mainClass)
6869
.assertNormalExit(output -> {
6970
output.shouldContain("ArrayKlassesApp source: shared objects file (top)")
71+
.shouldContain("restore: ArrayKlassesApp with class loader: jdk.internal.loader.ClassLoaders$AppClassLoader")
7072
.shouldContain("[LArrayKlassesApp; source: shared objects file (top)")
73+
.shouldContain("restore: [LArrayKlassesApp; with class loader: jdk.internal.loader.ClassLoaders$AppClassLoader")
7174
.shouldContain("[[LArrayKlassesApp; source: shared objects file (top)")
75+
.shouldContain("restore: [[LArrayKlassesApp; with class loader: jdk.internal.loader.ClassLoaders$AppClassLoader")
7276
.shouldContain("[[[LArrayKlassesApp; source: shared objects file (top)")
77+
.shouldContain("restore: [[[LArrayKlassesApp; with class loader: jdk.internal.loader.ClassLoaders$AppClassLoader")
7378
.shouldHaveExitValue(0);
7479
});
7580

@@ -90,14 +95,17 @@ static void test() throws Exception {
9095
// Case 2
9196
// At runtime, the java/util/Date class should be loaded from the default
9297
// CDS archive; its array class should be loaded from the dynamic archive.
93-
run2(null, topArchiveName,
94-
"-Xlog:class+load,class+load+array=debug,cds+dynamic=debug,cds=debug",
98+
run2(null, topArchiveName, runtimeLogOptions,
9599
"-cp", appJar, mainClass, "system")
96100
.assertNormalExit(output -> {
97101
output.shouldContain("java.util.Date source: shared objects file")
102+
.shouldContain("restore: java.util.Date with class loader: boot")
98103
.shouldContain("[Ljava.util.Date; source: shared objects file (top)")
104+
.shouldContain("restore: [Ljava.util.Date; with class loader: boot")
99105
.shouldContain("[[Ljava.util.Date; source: shared objects file (top)")
106+
.shouldContain("restore: [[Ljava.util.Date; with class loader: boot")
100107
.shouldContain("[[[Ljava.util.Date; source: shared objects file (top)")
108+
.shouldContain("restore: [[[Ljava.util.Date; with class loader: boot")
101109
.shouldHaveExitValue(0);
102110
});
103111

@@ -116,13 +124,15 @@ static void test() throws Exception {
116124
// Case 3
117125
// At runtime, the [J should be loaded from the default CDS archive;
118126
// the higher-dimension array should be loaded from the dynamic archive.
119-
run2(null, topArchiveName,
120-
"-Xlog:class+load,class+load+array=debug,cds+dynamic=debug,cds=debug",
127+
run2(null, topArchiveName, runtimeLogOptions,
121128
"-cp", appJar, mainClass, "primitive")
122129
.assertNormalExit(output -> {
123130
output.shouldContain("[J source: shared objects file")
131+
.shouldContain("restore: [J with class loader: boot")
124132
.shouldContain("[[J source: shared objects file (top)")
133+
.shouldContain("restore: [[J with class loader: boot")
125134
.shouldContain("[[[J source: shared objects file (top)")
135+
.shouldContain("restore: [[[J with class loader: boot")
126136
.shouldHaveExitValue(0);
127137
});
128138

@@ -142,13 +152,18 @@ static void test() throws Exception {
142152
// Case 4
143153
// At runtime, the 4-dimension array of java/lang/Integer should be
144154
// loaded from the dynamic archive.
145-
run2(null, topArchiveName,
146-
"-Xlog:class+load,class+load+array=debug,cds+dynamic=debug,cds=debug",
155+
run2(null, topArchiveName, runtimeLogOptions,
147156
"-cp", appJar, mainClass, "integer-array")
148157
.assertNormalExit(output -> {
149-
output.shouldContain("[[Ljava.lang.Integer; source: shared objects file (top)")
158+
output.shouldContain("java.lang.Integer source: shared objects file")
159+
.shouldContain("restore: java.lang.Integer with class loader: boot")
160+
.shouldContain("restore: [Ljava.lang.Integer; with class loader: boot")
161+
.shouldContain("[[Ljava.lang.Integer; source: shared objects file (top)")
162+
.shouldContain("restore: [[Ljava.lang.Integer; with class loader: boot")
150163
.shouldContain("[[[Ljava.lang.Integer; source: shared objects file (top)")
164+
.shouldContain("restore: [[[Ljava.lang.Integer; with class loader: boot")
151165
.shouldContain("[[[[Ljava.lang.Integer; source: shared objects file (top)")
166+
.shouldContain("restore: [[[[Ljava.lang.Integer; with class loader: boot")
152167
.shouldHaveExitValue(0);
153168
});
154169
}

0 commit comments

Comments
 (0)