author | prr |
Thu, 26 Jul 2018 10:00:40 -0700 | |
changeset 51251 | 0a7a0a6dfa22 |
parent 50455 | 2b73cce96dce |
child 52925 | 9c18c9d839d3 |
permissions | -rw-r--r-- |
41077
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
1 |
/* |
50455
2b73cce96dce
8202611: [GRAAL] Exclude CMS GC testing from runs with Graal
kvn
parents:
48791
diff
changeset
|
2 |
* Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. |
41077
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
3 |
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
4 |
* |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
5 |
* This code is free software; you can redistribute it and/or modify it |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
6 |
* under the terms of the GNU General Public License version 2 only, as |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
7 |
* published by the Free Software Foundation. |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
8 |
* |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
9 |
* This code is distributed in the hope that it will be useful, but WITHOUT |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
10 |
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
11 |
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
12 |
* version 2 for more details (a copy is included in the LICENSE file that |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
13 |
* accompanied this code). |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
14 |
* |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
15 |
* You should have received a copy of the GNU General Public License version |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
16 |
* 2 along with this work; if not, write to the Free Software Foundation, |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
17 |
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
18 |
* |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
19 |
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
20 |
* or visit www.oracle.com if you need additional information or have any |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
21 |
* questions. |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
22 |
*/ |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
23 |
|
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
24 |
/* |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
25 |
* @test |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
26 |
* @key gc |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
27 |
* @bug 8114823 |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
28 |
* @requires vm.gc == null |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
29 |
* @requires vm.opt.ExplicitGCInvokesConcurrent != true |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
30 |
* @requires vm.opt.ClassUnloading != true |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
31 |
* @library /test/lib |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
32 |
* @modules java.base/jdk.internal.misc |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
33 |
* java.management |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
34 |
* @build sun.hotspot.WhiteBox |
48791
6e079ff6c83c
8186635: ClassFileInstaller should be run as a driver
iignatyev
parents:
47216
diff
changeset
|
35 |
* @run driver ClassFileInstaller sun.hotspot.WhiteBox |
41077
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
36 |
* sun.hotspot.WhiteBox$WhiteBoxPermission |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
37 |
* |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
38 |
* @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
39 |
* -XX:-ClassUnloading -XX:+UseG1GC TestClassUnloadingDisabled |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
40 |
* |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
41 |
* @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
42 |
* -XX:-ClassUnloading -XX:+UseSerialGC TestClassUnloadingDisabled |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
43 |
* |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
44 |
* @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
45 |
* -XX:-ClassUnloading -XX:+UseParallelGC TestClassUnloadingDisabled |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
46 |
* |
50455
2b73cce96dce
8202611: [GRAAL] Exclude CMS GC testing from runs with Graal
kvn
parents:
48791
diff
changeset
|
47 |
*/ |
2b73cce96dce
8202611: [GRAAL] Exclude CMS GC testing from runs with Graal
kvn
parents:
48791
diff
changeset
|
48 |
|
2b73cce96dce
8202611: [GRAAL] Exclude CMS GC testing from runs with Graal
kvn
parents:
48791
diff
changeset
|
49 |
/* |
2b73cce96dce
8202611: [GRAAL] Exclude CMS GC testing from runs with Graal
kvn
parents:
48791
diff
changeset
|
50 |
* @test |
2b73cce96dce
8202611: [GRAAL] Exclude CMS GC testing from runs with Graal
kvn
parents:
48791
diff
changeset
|
51 |
* @key gc |
2b73cce96dce
8202611: [GRAAL] Exclude CMS GC testing from runs with Graal
kvn
parents:
48791
diff
changeset
|
52 |
* @bug 8114823 |
2b73cce96dce
8202611: [GRAAL] Exclude CMS GC testing from runs with Graal
kvn
parents:
48791
diff
changeset
|
53 |
* @comment Graal does not support CMS |
2b73cce96dce
8202611: [GRAAL] Exclude CMS GC testing from runs with Graal
kvn
parents:
48791
diff
changeset
|
54 |
* @requires vm.gc=="null" & !vm.graal.enabled |
2b73cce96dce
8202611: [GRAAL] Exclude CMS GC testing from runs with Graal
kvn
parents:
48791
diff
changeset
|
55 |
* @requires vm.opt.ExplicitGCInvokesConcurrent != true |
2b73cce96dce
8202611: [GRAAL] Exclude CMS GC testing from runs with Graal
kvn
parents:
48791
diff
changeset
|
56 |
* @requires vm.opt.ClassUnloading != true |
2b73cce96dce
8202611: [GRAAL] Exclude CMS GC testing from runs with Graal
kvn
parents:
48791
diff
changeset
|
57 |
* @library /test/lib |
2b73cce96dce
8202611: [GRAAL] Exclude CMS GC testing from runs with Graal
kvn
parents:
48791
diff
changeset
|
58 |
* @modules java.base/jdk.internal.misc |
2b73cce96dce
8202611: [GRAAL] Exclude CMS GC testing from runs with Graal
kvn
parents:
48791
diff
changeset
|
59 |
* java.management |
2b73cce96dce
8202611: [GRAAL] Exclude CMS GC testing from runs with Graal
kvn
parents:
48791
diff
changeset
|
60 |
* @build sun.hotspot.WhiteBox |
2b73cce96dce
8202611: [GRAAL] Exclude CMS GC testing from runs with Graal
kvn
parents:
48791
diff
changeset
|
61 |
* @run driver ClassFileInstaller sun.hotspot.WhiteBox |
2b73cce96dce
8202611: [GRAAL] Exclude CMS GC testing from runs with Graal
kvn
parents:
48791
diff
changeset
|
62 |
* sun.hotspot.WhiteBox$WhiteBoxPermission |
41077
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
63 |
* @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
64 |
* -XX:-ClassUnloading -XX:+UseConcMarkSweepGC TestClassUnloadingDisabled |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
65 |
*/ |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
66 |
|
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
67 |
import java.io.File; |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
68 |
import java.io.IOException; |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
69 |
import java.nio.file.Files; |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
70 |
import java.nio.file.Path; |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
71 |
import java.nio.file.Paths; |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
72 |
|
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
73 |
import sun.hotspot.WhiteBox; |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
74 |
|
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
75 |
import static jdk.test.lib.Asserts.*; |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
76 |
|
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
77 |
public class TestClassUnloadingDisabled { |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
78 |
public static void main(String args[]) throws Exception { |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
79 |
final WhiteBox wb = WhiteBox.getWhiteBox(); |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
80 |
// Fetch the dir where the test class and the class |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
81 |
// to be loaded resides. |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
82 |
String classDir = TestClassUnloadingDisabled.class.getProtectionDomain().getCodeSource().getLocation().getPath(); |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
83 |
String className = "ClassToLoadUnload"; |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
84 |
|
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
85 |
assertFalse(wb.isClassAlive(className), "Should not be loaded yet"); |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
86 |
|
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
87 |
// The NoPDClassLoader handles loading classes in the test directory |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
88 |
// and loads them without a protection domain, which in some cases |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
89 |
// keeps the class live regardless of marking state. |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
90 |
NoPDClassLoader nopd = new NoPDClassLoader(classDir); |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
91 |
nopd.loadClass(className); |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
92 |
|
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
93 |
assertTrue(wb.isClassAlive(className), "Class should be loaded"); |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
94 |
|
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
95 |
// Clear the class-loader, class and object references to make |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
96 |
// class unloading possible. |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
97 |
nopd = null; |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
98 |
|
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
99 |
System.gc(); |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
100 |
assertTrue(wb.isClassAlive(className), "Class should not have ben unloaded"); |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
101 |
} |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
102 |
} |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
103 |
|
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
104 |
class NoPDClassLoader extends ClassLoader { |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
105 |
String path; |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
106 |
|
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
107 |
NoPDClassLoader(String path) { |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
108 |
this.path = path; |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
109 |
} |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
110 |
|
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
111 |
public Class<?> loadClass(String name) throws ClassNotFoundException { |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
112 |
byte[] cls = null; |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
113 |
File f = new File(path,name + ".class"); |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
114 |
|
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
115 |
// Delegate class loading if class not present in the given |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
116 |
// directory. |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
117 |
if (!f.exists()) { |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
118 |
return super.loadClass(name); |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
119 |
} |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
120 |
|
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
121 |
try { |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
122 |
Path path = Paths.get(f.getAbsolutePath()); |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
123 |
cls = Files.readAllBytes(path); |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
124 |
} catch (IOException e) { |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
125 |
throw new ClassNotFoundException(name); |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
126 |
} |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
127 |
|
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
128 |
// Define class with no protection domain and resolve it. |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
129 |
return defineClass(name, cls, 0, cls.length, null); |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
130 |
} |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
131 |
} |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
132 |
|
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
133 |
class ClassToLoadUnload { |
19f70464986e
8114823: G1 doesn't honor request to disable class unloading
sjohanss
parents:
diff
changeset
|
134 |
} |