8203820: [TESTBUG] vmTestbase/metaspace/staticReferences/StaticReferences.java timed out
authorcoleenp
Fri, 20 Jul 2018 18:03:23 -0400
changeset 51221 b65916c52e3c
parent 51220 23167d80e0f2
child 51222 d5138f8da1ba
8203820: [TESTBUG] vmTestbase/metaspace/staticReferences/StaticReferences.java timed out Summary: Moved InMemoryJavaCompiler out of loops or reduced loops with InMemoryJavaCompiler Reviewed-by: vromero, jiangli
test/hotspot/jtreg/vmTestbase/metaspace/staticReferences/StaticReferences.java
test/hotspot/jtreg/vmTestbase/metaspace/stressDictionary/StressDictionary.java
test/hotspot/jtreg/vmTestbase/nsk/jvmti/RedefineClasses/StressRedefine.java
--- a/test/hotspot/jtreg/vmTestbase/metaspace/staticReferences/StaticReferences.java	Fri Jul 20 14:34:51 2018 -0700
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/staticReferences/StaticReferences.java	Fri Jul 20 18:03:23 2018 -0400
@@ -67,7 +67,7 @@
 /**
  * Test checks that static fields will be initialized in new loaded class. Test performs in loop the following routine:
  * 1.) Load class either by regular classloader or by Unsafe.defineAnonymousClass.
- * 2.) Trigger unloading. Class must be alive. Next step will check that static fields would not lost.
+ * 2.) Trigger unloading. Class must be alive. Next step will check that static fields were not lost.
  * 3.) Change static fields.
  * 4.) Unload class.
  * 5.) Load class again as in step 1.
@@ -82,7 +82,7 @@
 
     private static String[] args;
 
-    private static final int LIMIT = 100;
+    private static final int LIMIT = 20;
 
     private List<Object> keepAlive = new LinkedList<Object>();
 
@@ -103,7 +103,7 @@
 
         @Override
     public void run() {
-                random = new Random(runParams.getSeed());
+        random = new Random(runParams.getSeed());
         ExecutionController stresser = new Stresser(args);
         stresser.start(1);
 
@@ -116,7 +116,7 @@
                         return;
                 }
             for (int j = 0; j < fieldQuantities.length; j++) {
-                fieldQuantities[j] = 1 + random.nextInt(2000);
+                fieldQuantities[j] = 1 + random.nextInt(20);
             }
             bytecodeList.add(generateAndCompile(fieldQuantities));
         }
@@ -209,9 +209,9 @@
         }
     }
 
-    private byte[] generateAndCompile(int[] filedQuantities) {
+    private byte[] generateAndCompile(int[] fieldQuantities) {
         Map<String, CharSequence> sources = new HashMap<String, CharSequence>();
-        sources.put("A", generateSource(filedQuantities));
+        sources.put("A", generateSource(fieldQuantities));
         return InMemoryJavaCompiler.compile(sources).values().iterator().next();
     }
 
--- a/test/hotspot/jtreg/vmTestbase/metaspace/stressDictionary/StressDictionary.java	Fri Jul 20 14:34:51 2018 -0700
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/stressDictionary/StressDictionary.java	Fri Jul 20 18:03:23 2018 -0400
@@ -29,7 +29,7 @@
  *
  * @library /vmTestbase /test/lib
  * @run driver jdk.test.lib.FileInstaller . .
- * @run main/othervm metaspace.stressDictionary.StressDictionary
+ * @run main/othervm metaspace.stressDictionary.StressDictionary -stressTime 30
  */
 
 package metaspace.stressDictionary;
@@ -57,15 +57,16 @@
  */
 public class StressDictionary extends GCTestBase {
 
+    private static byte[] bytecode;
+
     private class FillingDictionaryWorker implements Callable<Object> {
         @Override
         public Object call() throws Exception {
             while (stresser.continueExecution()) {
                 try {
-                    byte[] bytecode = generateAndCompile();
-                    bytecode[random.nextInt(bytecode.length)] = (byte) 42;
-                    classloader.define(bytecode);
-                    changeClassloaderIfRequired();
+                    byte[] badBytecode = bytecode.clone();
+                    badBytecode[random.nextInt(badBytecode.length)] = (byte) 42;
+                    classloader.define(badBytecode);
                 } catch (Throwable e) {
                     // We can get ClassFormatError, ClassNotFoundException or anything else here
                 }
@@ -78,10 +79,8 @@
         @Override
         public Object call() throws Exception {
             while (stresser.continueExecution()) {
-                byte[] bytecode = generateAndCompile();
                 Class<?> c = classloader.define(bytecode);
                 testClass(c);
-                changeClassloaderIfRequired();
             }
             return null;
         }
@@ -89,8 +88,6 @@
 
     private static String[] args;
 
-    private static final int DROP_CLASSLOADER_LIMIT = 50000;
-
     private static final String methodName = "myMethod";
 
     private static final int NUMBER_OF_CORRUPTING_THREADS = 10;
@@ -116,6 +113,8 @@
         random = new Random(runParams.getSeed());
         stresser = new Stresser(args);
         stresser.start(1);
+        // Generate some bytecodes.
+        bytecode = generateAndCompile();
         List<Callable<Object>> tasks = new LinkedList<Callable<Object>>();
         for (int i = 0; i < NUMBER_OF_CORRUPTING_THREADS; i++) {
             tasks.add(this.new FillingDictionaryWorker());
@@ -131,13 +130,6 @@
         }
     }
 
-    private void changeClassloaderIfRequired() {
-        if (ManagementFactory.getClassLoadingMXBean().getLoadedClassCount() > DROP_CLASSLOADER_LIMIT) {
-          ClassloaderUnderTest newOne = new ClassloaderUnderTest();
-          classloader = newOne;
-        }
-    }
-
     private byte[] generateAndCompile() {
         Map<String, CharSequence> sources = new HashMap<String, CharSequence>();
         String className = "MyClass" + classesCounter.incrementAndGet();
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/RedefineClasses/StressRedefine.java	Fri Jul 20 14:34:51 2018 -0700
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/RedefineClasses/StressRedefine.java	Fri Jul 20 18:03:23 2018 -0400
@@ -61,7 +61,10 @@
     private static ExecutionController stresser;
     private static String[] args;
 
-    // This is random generator used for generating seeds for other Randoms. Setting seed from command line sets seed for this random.
+    private static byte[] bytecode;
+
+    // This is random generator used for generating seeds for other Randoms. Setting seed
+    // from command line sets seed for this random.
     static Random seedGenerator;
 
     static {
@@ -82,47 +85,53 @@
         Tests.runTest(new StressRedefine(), args);
     }
 
-        @Override
-        public void run() {
-                seedGenerator = new Random(runParams.getSeed());
-                GenerateSourceHelper.setRandom(new Random(seedGenerator.nextLong()));
+    @Override
+    public void run() {
+        seedGenerator = new Random(runParams.getSeed());
+        GenerateSourceHelper.setRandom(new Random(seedGenerator.nextLong()));
         stresser = new Stresser(args);
 
         for (int i = 0; i < args.length; i++ ) {
-                if ("-staticMethodCallersNumber".equals(args[i])) {
-                        staticMethodCallersNumber = Integer.parseInt(args[i + 1]);
-                } else if ("-nonstaticMethodCallersNumber".equals(args[i])) {
-                        nonstaticMethodCallersNumber = Integer.parseInt(args[i + 1]);
-                } else if ("-redefiningThreadsNumber".equals(args[i])) {
-                        redefiningThreadsNumber = Integer.parseInt(args[i + 1]);
-                } else if ("-corruptingBytecodeProbability".equals(args[i])) {
-                        corruptingBytecodeProbability = Double.parseDouble(args[i + 1]);
-                }
+            if ("-staticMethodCallersNumber".equals(args[i])) {
+                staticMethodCallersNumber = Integer.parseInt(args[i + 1]);
+            } else if ("-nonstaticMethodCallersNumber".equals(args[i])) {
+                nonstaticMethodCallersNumber = Integer.parseInt(args[i + 1]);
+            } else if ("-redefiningThreadsNumber".equals(args[i])) {
+                redefiningThreadsNumber = Integer.parseInt(args[i + 1]);
+            } else if ("-corruptingBytecodeProbability".equals(args[i])) {
+                corruptingBytecodeProbability = Double.parseDouble(args[i + 1]);
+            }
         }
 
         //Dynamic attach if required
         nsk.share.jvmti.JVMTITest.commonInit(args);
 
         new StressRedefine().runIt();
+    }
+
+    private static void runMethod(Random random, String name) {
+        while (stresser.continueExecution()) {
+            try {
+                // Just for fun we transfer parameters to method
+                Object res = myClass.getMethod(name, double.class, int.class, Object.class)
+                                         .invoke(null, random.nextDouble(), random.nextInt(), new Object());
+             } catch (IllegalArgumentException | InvocationTargetException
+                     | IllegalAccessException | NoSuchMethodException e) {
+                 // It's okay to get exception here since we are corrupting bytecode and can't expect
+                 // class to work properly.
+                 System.out.println("Got expected exception: " + e.toString());
+             }
         }
+    }
 
     private static class StaticMethodCaller implements Runnable {
         private Random random;
         public StaticMethodCaller() {random = new Random(seedGenerator.nextLong());}
 
-                @Override
-                public void run() {
-                        while (stresser.continueExecution()) {
-                                try {
-                                        Object res = myClass.getMethod(GenerateSourceHelper.STATIC_METHOD_NAME, double.class, int.class, Object.class).invoke(
-                                                        null, random.nextDouble(), random.nextInt(), new Object()); // Just for fun we transfer parameters to method
-                                } catch (IllegalArgumentException | InvocationTargetException
-                                                | IllegalAccessException | NoSuchMethodException e) {
-                                        //It's okay to get exception here since we are corrupting bytecode and can't expect class to work properly.
-                                        System.out.println("Got expected exception: " + e.toString());
-                                }
-                        }
-                }
+        @Override
+        public void run() {
+            runMethod(random, GenerateSourceHelper.STATIC_METHOD_NAME);
+        }
     }
 
     private static class NonstaticMethodCaller implements Runnable {
@@ -130,59 +139,54 @@
         public NonstaticMethodCaller() {random = new Random(seedGenerator.nextLong());}
 
         @Override
-                public void run() {
-                        while (stresser.continueExecution()) {
-                                try {
-                                        Object res = myClass.getMethod(GenerateSourceHelper.NONSTATIC_METHOD_NAME, double.class, int.class, Object.class).
-                                                        invoke(myClass.newInstance(), random.nextDouble(), random.nextInt(), new Object()); // Just for fun we transfer parameters to method
-                                } catch (IllegalArgumentException | InvocationTargetException | NoSuchMethodException | InstantiationException | IllegalAccessException e) {
-                                        //It's okay to get exception here since we are corrupting bytecode and can't expect class to work properly.
-                                        System.out.println("Got expected exception: " + e.toString());
-                                }
-                        }
-                }
+        public void run() {
+            runMethod(random, GenerateSourceHelper.NONSTATIC_METHOD_NAME);
+        }
     }
 
     private static class Worker implements Runnable {
         private Random random;
         public Worker() {random = new Random(seedGenerator.nextLong());}
 
-                @Override
-                public void run() {
-                        while (stresser.continueExecution()) {
-                                byte[] bytecode = generateAndCompile();
-                                if (random.nextDouble() < corruptingBytecodeProbability) {
-                                        bytecode[random.nextInt(bytecode.length)] = 42;
-                                }
-                                makeRedefinition(2, myClass, bytecode);
-                        }
+        @Override
+        public void run() {
+            while (stresser.continueExecution()) {
+                byte[] badBytecode = bytecode.clone();
+                if (random.nextDouble() < corruptingBytecodeProbability) {
+                    badBytecode[random.nextInt(bytecode.length)] = 42;
                 }
+                makeRedefinition(2, myClass, badBytecode);
+            }
+        }
     }
 
     private void runIt() {
         myClass = new DefiningClassLoader().defineClass(generateAndCompile());
         stresser.start(0);
 
+        // Generate some bytecode.
+        bytecode = generateAndCompile();
+
         List<Thread> threads = new LinkedList<Thread>();
         for (int i = 0; i < staticMethodCallersNumber; i++) {
-                threads.add(new Thread(new StaticMethodCaller()));
+            threads.add(new Thread(new StaticMethodCaller()));
         }
         for (int i = 0; i < nonstaticMethodCallersNumber; i++) {
-                threads.add(new Thread(new NonstaticMethodCaller()));
+            threads.add(new Thread(new NonstaticMethodCaller()));
         }
         for (int i = 0; i < redefiningThreadsNumber; i++) {
-                threads.add(new Thread(new Worker()));
+            threads.add(new Thread(new Worker()));
         }
 
         for (Thread thread : threads) {
-                thread.start();
+            thread.start();
         }
         for (Thread thread : threads) {
-                try {
-                        thread.join();
-                } catch (InterruptedException e) {
-                        throw new TestFailure("Thread " + Thread.currentThread() + " was interrupted:", e);
-                }
+            try {
+                thread.join();
+            } catch (InterruptedException e) {
+                throw new TestFailure("Thread " + Thread.currentThread() + " was interrupted:", e);
+            }
         }
     }
 
@@ -192,15 +196,14 @@
         return InMemoryJavaCompiler.compile(sources).values().iterator().next();
     }
 
-        // Auxiliary classloader. Used only once at the beginning.
-        private static class DefiningClassLoader extends URLClassLoader {
-                public DefiningClassLoader() {
-                        super(new URL[0]);
-                }
-
-                Class<?> defineClass(byte[] bytecode) {
-                        return defineClass(null, bytecode, 0, bytecode.length);
-                }
+    // Auxiliary classloader. Used only once at the beginning.
+    private static class DefiningClassLoader extends URLClassLoader {
+        public DefiningClassLoader() {
+            super(new URL[0]);
         }
 
+        Class<?> defineClass(byte[] bytecode) {
+            return defineClass(null, bytecode, 0, bytecode.length);
+        }
+    }
 }