0

Environment: jdk8 , use byteman with maven test.

I use byteman to instrument the following code into the java.util.ArrayList.size() menthod, but i meet a deadlock, it seems to a issue of byteman.

the instrument code: (as you can see, just sleep random time)

        java.util.Random rand = new java.util.Random();
        try{
            int time = rand.nextInt(10);
            Thread.sleep(time);
            // System.out.println("sleep "+time+" ms");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
Found one Java-level deadlock:
=============================
"pool-1-thread-1":
  waiting to lock monitor 0x00007fee50003308 (object 0x00000000aad29098, a sun.misc.URLClassPath),
  which is held by "surefire-forkedjvm-command-thread"
"surefire-forkedjvm-command-thread":
  waiting to lock monitor 0x00007fee80005fe8 (object 0x00000000a342fc48, a org.jboss.byteman.modules.ClassbyteClassLoader),
  which is held by "pool-1-thread-1"

Java stack information for the threads listed above:
===================================================
"pool-1-thread-1":
        at sun.misc.URLClassPath.knownToNotExist(URLClassPath.java:379)
        - waiting to lock <0x00000000aad29098> (a sun.misc.URLClassPath)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:336)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:405)
        - locked <0x00000000a342fc48> (a org.jboss.byteman.modules.ClassbyteClassLoader)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
        at sun.misc.Unsafe.defineClass(Native Method)
        at sun.reflect.ClassDefiner.defineClass(ClassDefiner.java:63)
        at sun.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:399)
        at sun.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:394)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.reflect.MethodAccessorGenerator.generate(MethodAccessorGenerator.java:393)
        at sun.reflect.MethodAccessorGenerator.generateConstructor(MethodAccessorGenerator.java:92)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:55)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at org.jboss.byteman.rule.Rule.execute(Rule.java:817)
        at org.jboss.byteman.rule.Rule.execute(Rule.java:789)
        at java.util.ArrayList.size(ArrayList.java:284)
        at sun.misc.URLClassPath.getLoader(URLClassPath.java:510)
        - locked <0x00000000aaf16ad8> (a sun.misc.URLClassPath)
        at sun.misc.URLClassPath.getNextLoader(URLClassPath.java:495)
        - locked <0x00000000aaf16ad8> (a sun.misc.URLClassPath)
        at sun.misc.URLClassPath.getResource(URLClassPath.java:249)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
        - locked <0x00000000a57ffbc8> (a java.lang.Object)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:405)
        - locked <0x00000000a57ffb18> (a java.lang.Object)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
        at org.junit.runner.notification.RunNotifier.fireTestStarted(RunNotifier.java:153)
        at org.apache.maven.surefire.common.junit4.Notifier.fireTestStarted(Notifier.java:100)
        at org.junit.internal.runners.model.EachTestNotifier.fireTestStarted(EachTestNotifier.java:42)
        at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:364)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63)
        at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
        at org.apache.maven.surefire.junitcore.pc.Scheduler$1.run(Scheduler.java:410)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:750)
"surefire-forkedjvm-command-thread":
        at sun.misc.Unsafe.defineClass(Native Method)
        at sun.reflect.ClassDefiner.defineClass(ClassDefiner.java:63)
        at sun.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:399)
        at sun.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:394)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.reflect.MethodAccessorGenerator.generate(MethodAccessorGenerator.java:393)
        at sun.reflect.MethodAccessorGenerator.generateConstructor(MethodAccessorGenerator.java:92)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:55)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at org.jboss.byteman.rule.Rule.execute(Rule.java:817)
        at org.jboss.byteman.rule.Rule.execute(Rule.java:789)
        at java.util.ArrayList.size(ArrayList.java:284)
        at sun.misc.URLClassPath.getLoader(URLClassPath.java:510)
        - locked <0x00000000aad29098> (a sun.misc.URLClassPath)
        at sun.misc.URLClassPath.getNextLoader(URLClassPath.java:495)
        - locked <0x00000000aad29098> (a sun.misc.URLClassPath)
        at sun.misc.URLClassPath.getResource(URLClassPath.java:249)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
        - locked <0x00000000a55f3b68> (a java.lang.Object)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
        at org.apache.maven.surefire.booter.MasterProcessCommand.decode(MasterProcessCommand.java:139)
        at org.apache.maven.surefire.booter.CommandReader$CommandRunnable.run(CommandReader.java:391)
        at java.lang.Thread.run(Thread.java:750)

Found 1 deadlock.

It looks like a issue of byteman implementation.

0 Answers0