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.