test/gc/metaspace/G1AddMetaspaceDependency.java

Thu, 23 Apr 2015 15:59:48 +0200

author
jwilhelm
date
Thu, 23 Apr 2015 15:59:48 +0200
changeset 7785
f967da7f0c3c
parent 5815
77a774ab3cf0
child 7994
04ff2f6cd0eb
permissions
-rw-r--r--

8062537: [TESTBUG] Conflicting GC combinations in hotspot tests
Reviewed-by: tschatzl, jwilhelm

mgerdin@4903 1 /*
jwilhelm@7785 2 * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
mgerdin@4903 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
mgerdin@4903 4 *
mgerdin@4903 5 * This code is free software; you can redistribute it and/or modify it
mgerdin@4903 6 * under the terms of the GNU General Public License version 2 only, as
mgerdin@4903 7 * published by the Free Software Foundation.
mgerdin@4903 8 *
mgerdin@4903 9 * This code is distributed in the hope that it will be useful, but WITHOUT
mgerdin@4903 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
mgerdin@4903 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
mgerdin@4903 12 * version 2 for more details (a copy is included in the LICENSE file that
mgerdin@4903 13 * accompanied this code).
mgerdin@4903 14 *
mgerdin@4903 15 * You should have received a copy of the GNU General Public License version
mgerdin@4903 16 * 2 along with this work; if not, write to the Free Software Foundation,
mgerdin@4903 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
mgerdin@4903 18 *
mgerdin@4903 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
mgerdin@4903 20 * or visit www.oracle.com if you need additional information or have any
mgerdin@4903 21 * questions.
mgerdin@4903 22 */
mgerdin@4903 23
mgerdin@4903 24 /*
mgerdin@4903 25 * @test G1AddMetaspaceDependency
mgerdin@4903 26 * @bug 8010196
jwilhelm@7785 27 * @requires vm.gc=="G1" | vm.gc=="null"
mgerdin@4903 28 * @summary Checks that we don't get locking problems when adding metaspace dependencies with the G1 update buffer monitor
mgerdin@4903 29 * @run main/othervm -XX:+UseG1GC -XX:G1UpdateBufferSize=1 G1AddMetaspaceDependency
mgerdin@4903 30 */
mgerdin@4903 31
mgerdin@4903 32 import java.io.InputStream;
mgerdin@4903 33
mgerdin@4903 34 public class G1AddMetaspaceDependency {
mgerdin@4903 35
mgerdin@4903 36 static byte[] getClassBytes(String name) {
mgerdin@4903 37 byte[] b = null;
mgerdin@4903 38 try (InputStream is = ClassLoader.getSystemResourceAsStream(name)) {
mgerdin@4903 39 byte[] tmp = new byte[is.available()];
mgerdin@4903 40 is.read(tmp);
mgerdin@4903 41 b = tmp;
mgerdin@4903 42 } finally {
mgerdin@4903 43 if (b == null) {
mgerdin@4903 44 throw new RuntimeException("Unable to load class file");
mgerdin@4903 45 }
mgerdin@4903 46 return b;
mgerdin@4903 47 }
mgerdin@4903 48 }
mgerdin@4903 49
mgerdin@4903 50 static final String a_name = G1AddMetaspaceDependency.class.getName() + "$A";
mgerdin@4903 51 static final String b_name = G1AddMetaspaceDependency.class.getName() + "$B";
mgerdin@4903 52
mgerdin@4903 53 public static void main(String... args) throws Exception {
mgerdin@4903 54 final byte[] a_bytes = getClassBytes(a_name + ".class");
mgerdin@4903 55 final byte[] b_bytes = getClassBytes(b_name + ".class");
mgerdin@4903 56
mgerdin@4903 57 for (int i = 0; i < 1000; i += 1) {
mgerdin@4903 58 runTest(a_bytes, b_bytes);
mgerdin@4903 59 }
mgerdin@4903 60 }
mgerdin@4903 61
mgerdin@4903 62 static class Loader extends ClassLoader {
mgerdin@4903 63 private final String myClass;
mgerdin@4903 64 private final byte[] myBytes;
mgerdin@4903 65 private final String friendClass;
mgerdin@4903 66 private final ClassLoader friendLoader;
mgerdin@4903 67
mgerdin@4903 68 Loader(String myClass, byte[] myBytes,
mgerdin@4903 69 String friendClass, ClassLoader friendLoader) {
mgerdin@4903 70 this.myClass = myClass;
mgerdin@4903 71 this.myBytes = myBytes;
mgerdin@4903 72 this.friendClass = friendClass;
mgerdin@4903 73 this.friendLoader = friendLoader;
mgerdin@4903 74 }
mgerdin@4903 75
mgerdin@4903 76 Loader(String myClass, byte[] myBytes) {
mgerdin@4903 77 this(myClass, myBytes, null, null);
mgerdin@4903 78 }
mgerdin@4903 79
mgerdin@4903 80 @Override
mgerdin@4903 81 public Class<?> loadClass(String name) throws ClassNotFoundException {
mgerdin@4903 82 Class<?> c = findLoadedClass(name);
mgerdin@4903 83 if (c != null) {
mgerdin@4903 84 return c;
mgerdin@4903 85 }
mgerdin@4903 86
mgerdin@4903 87 if (name.equals(friendClass)) {
mgerdin@4903 88 return friendLoader.loadClass(name);
mgerdin@4903 89 }
mgerdin@4903 90
mgerdin@4903 91 if (name.equals(myClass)) {
mgerdin@4903 92 c = defineClass(name, myBytes, 0, myBytes.length);
mgerdin@4903 93 resolveClass(c);
mgerdin@4903 94 return c;
mgerdin@4903 95 }
mgerdin@4903 96
mgerdin@4903 97 return findSystemClass(name);
mgerdin@4903 98 }
mgerdin@4903 99
mgerdin@4903 100 }
mgerdin@4903 101
mgerdin@4903 102 private static void runTest(final byte[] a_bytes, final byte[] b_bytes) throws Exception {
mgerdin@4903 103 Loader a_loader = new Loader(a_name, a_bytes);
mgerdin@4903 104 Loader b_loader = new Loader(b_name, b_bytes, a_name, a_loader);
mgerdin@4903 105 Loader c_loader = new Loader(b_name, b_bytes, a_name, a_loader);
mgerdin@4903 106 Loader d_loader = new Loader(b_name, b_bytes, a_name, a_loader);
mgerdin@4903 107 Loader e_loader = new Loader(b_name, b_bytes, a_name, a_loader);
mgerdin@4903 108 Loader f_loader = new Loader(b_name, b_bytes, a_name, a_loader);
mgerdin@4903 109 Loader g_loader = new Loader(b_name, b_bytes, a_name, a_loader);
mgerdin@4903 110
mgerdin@4903 111 Class<?> c;
mgerdin@4903 112 c = b_loader.loadClass(b_name);
mgerdin@4903 113 c = c_loader.loadClass(b_name);
mgerdin@4903 114 c = d_loader.loadClass(b_name);
mgerdin@4903 115 c = e_loader.loadClass(b_name);
mgerdin@4903 116 c = f_loader.loadClass(b_name);
mgerdin@4903 117 c = g_loader.loadClass(b_name);
mgerdin@4903 118 }
mgerdin@4903 119 public class A {
mgerdin@4903 120 }
mgerdin@4903 121 class B extends A {
mgerdin@4903 122 }
mgerdin@4903 123 }

mercurial