4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24 import sun.hotspot.WhiteBox;
25
26 import java.lang.reflect.Method;
27 import java.net.URL;
28 import java.net.URLClassLoader;
29
30 /*
31 * @test MethodUnloadingTest
32 * @bug 8029443
33 * @summary "Tests the unloading of methods to to class unloading"
34 * @modules java.base/jdk.internal.misc
35 * @library /testlibrary /test/lib
36 * @build TestMethodUnloading
37 * @build WorkerClass
38 * @run main ClassFileInstaller sun.hotspot.WhiteBox
39 * sun.hotspot.WhiteBox$WhiteBoxPermission
40 * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:-BackgroundCompilation -XX:-UseCompressedOops -XX:CompileOnly=TestMethodUnloading::doWork TestMethodUnloading
41 */
42 public class TestMethodUnloading {
43 private static final String workerClassName = "WorkerClass";
44 private static int work = -1;
45
46 private static final WhiteBox WHITE_BOX = WhiteBox.getWhiteBox();
47 private static int COMP_LEVEL_SIMPLE = 1;
48 private static int COMP_LEVEL_FULL_OPTIMIZATION = 4;
49
50 /**
51 * Does some work by either using the workerClass or locally producing values.
52 * @param workerClass Class performing some work (will be unloaded)
53 * @param useWorker If true the workerClass is used
54 */
55 static private void doWork(Class<?> workerClass, boolean useWorker) throws InstantiationException, IllegalAccessException {
56 if (useWorker) {
57 // Create a new instance
58 Object worker = workerClass.newInstance();
59 // We would like to call a method of WorkerClass here but we cannot cast to WorkerClass
60 // because the class was loaded by a different class loader. One solution would be to use
61 // reflection but since we want C2 to implement the call as an optimized IC we call
62 // Object::hashCode() here which actually calls WorkerClass::hashCode().
63 // C2 will then implement this call as an optimized IC that points to a to-interpreter stub
|
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24 /*
25 * @test MethodUnloadingTest
26 * @bug 8029443
27 * @summary Tests the unloading of methods to to class unloading
28 * @modules java.base/jdk.internal.misc
29 * @library /testlibrary /test/lib /
30 *
31 * @build compiler.classUnloading.methodUnloading.TestMethodUnloading
32 * compiler.classUnloading.methodUnloading.WorkerClass
33 * @run driver ClassFileInstaller sun.hotspot.WhiteBox
34 * sun.hotspot.WhiteBox$WhiteBoxPermission
35 * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions
36 * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI
37 * -XX:-BackgroundCompilation -XX:-UseCompressedOops
38 * -XX:CompileCommand=compileonly,compiler.classUnloading.methodUnloading.TestMethodUnloading::doWork
39 * compiler.classUnloading.methodUnloading.TestMethodUnloading
40 */
41
42 package compiler.classUnloading.methodUnloading;
43
44 import sun.hotspot.WhiteBox;
45
46 import java.lang.reflect.Method;
47 import java.net.URL;
48 import java.net.URLClassLoader;
49
50 public class TestMethodUnloading {
51 private static final String workerClassName = "compiler.classUnloading.methodUnloading.WorkerClass";
52 private static int work = -1;
53
54 private static final WhiteBox WHITE_BOX = WhiteBox.getWhiteBox();
55 private static int COMP_LEVEL_SIMPLE = 1;
56 private static int COMP_LEVEL_FULL_OPTIMIZATION = 4;
57
58 /**
59 * Does some work by either using the workerClass or locally producing values.
60 * @param workerClass Class performing some work (will be unloaded)
61 * @param useWorker If true the workerClass is used
62 */
63 static private void doWork(Class<?> workerClass, boolean useWorker) throws InstantiationException, IllegalAccessException {
64 if (useWorker) {
65 // Create a new instance
66 Object worker = workerClass.newInstance();
67 // We would like to call a method of WorkerClass here but we cannot cast to WorkerClass
68 // because the class was loaded by a different class loader. One solution would be to use
69 // reflection but since we want C2 to implement the call as an optimized IC we call
70 // Object::hashCode() here which actually calls WorkerClass::hashCode().
71 // C2 will then implement this call as an optimized IC that points to a to-interpreter stub
|