0

Could somebody help me and explain what exactly is going on, looking at the following thread dump. It is a web application running on Tomcat 7 and we experience that some requests do not get answered:

"ajp-bio-8012-exec-161" daemon prio=10 tid=0x00007fe170603000 nid=0x344f runnable [0x00007fe174fae000]
   java.lang.Thread.State: RUNNABLE
    at java.security.AccessController.doPrivileged(Native Method)
    at java.io.FilePermission.init(FilePermission.java:209)
    at java.io.FilePermission.<init>(FilePermission.java:285)
    at java.lang.SecurityManager.checkRead(SecurityManager.java:888)
    at java.io.File.exists(File.java:808)
    at sun.misc.URLClassPath$FileLoader.getResource(URLClassPath.java:1080)
    at sun.misc.URLClassPath$FileLoader.findResource(URLClassPath.java:1047)
    at sun.misc.URLClassPath.findResource(URLClassPath.java:176)
    at java.net.URLClassLoader$2.run(URLClassLoader.java:551)
    at java.net.URLClassLoader$2.run(URLClassLoader.java:549)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findResource(URLClassLoader.java:548)
    at java.lang.ClassLoader.getResource(ClassLoader.java:1147)
    at java.lang.ClassLoader.getResource(ClassLoader.java:1142)
    at org.apache.catalina.loader.WebappClassLoader.getResource(WebappClassLoader.java:1445)
    at java.lang.Class.getResource(Class.java:2142)
    at javassist.ClassClassPath.find(ClassClassPath.java:84)
    at javassist.ClassPoolTail.find(ClassPoolTail.java:317)
    at javassist.ClassPool.find(ClassPool.java:495)
    at javassist.ClassPool.createCtClass(ClassPool.java:479)
    at javassist.ClassPool.get0(ClassPool.java:445)
    - locked <0x00000000db6cdb48> (a javassist.ClassPool)
    at javassist.ClassPool.get(ClassPool.java:414)
    at javassist.compiler.MemberResolver.lookupClass0(MemberResolver.java:425)
    at javassist.compiler.MemberResolver.lookupClass(MemberResolver.java:389)
    at javassist.compiler.MemberResolver.lookupClassByJvmName(MemberResolver.java:310)
    at javassist.compiler.MemberResolver.lookupClass(MemberResolver.java:327)
    at javassist.compiler.MemberResolver.lookupClass(MemberResolver.java:314)
    at javassist.compiler.Javac.compileField(Javac.java:122)
    at javassist.compiler.Javac.compile(Javac.java:91)
    at javassist.CtField.make(CtField.java:163)
    at com.mycompany.validation.util.BeanGenerator.addProperty(BeanGenerator.java:157)
    ...
    at java.lang.Thread.run(Thread.java:745)


"ajp-bio-8012-exec-12" daemon prio=10 tid=0x0000000000c49800 nid=0x3d99 waiting for monitor entry [0x00007fe1756b7000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at javassist.ClassPool.get0(ClassPool.java:432)
    - waiting to lock <0x00000000db6cdb48> (a javassist.ClassPool)
    at javassist.ClassPool.get(ClassPool.java:414)
    at javassist.compiler.MemberResolver.lookupClass0(MemberResolver.java:425)
    at javassist.compiler.MemberResolver.lookupClass(MemberResolver.java:389)
    at javassist.compiler.MemberResolver.lookupClassByJvmName(MemberResolver.java:310)
    at javassist.compiler.MemberResolver.lookupClass(MemberResolver.java:327)
    at javassist.compiler.MemberResolver.lookupClass(MemberResolver.java:314)
    at javassist.compiler.Javac.compileField(Javac.java:122)
    at javassist.compiler.Javac.compile(Javac.java:91)
    at javassist.CtField.make(CtField.java:163)
    at com.mycompany.validation.util.BeanGenerator.addProperty(BeanGenerator.java:157)
    ...
    at java.lang.Thread.run(Thread.java:745)



"ajp-bio-8012-exec-5" daemon prio=10 tid=0x0000000001603800 nid=0x7c77 waiting for monitor entry [0x00007fe174aaa000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at javassist.ClassPool.makeClass(ClassPool.java:621)
    - waiting to lock <0x00000000db6cdb48> (a javassist.ClassPool)
    at javassist.ClassPool.makeClass(ClassPool.java:606)
    at com.mycompany.validation.util.BeanGenerator.init(BeanGenerator.java:334)
    ...
    at java.lang.Thread.run(Thread.java:745)    

I am not a specialist in thread dumps and just would like to know how to get rid of the problem.

Has the first thread locked an object (ClassPool) that two other request threads are waiting for to unlock? Why is it locked? Do I have to synchronize and how?

Thanks for any hint!

Arnab Biswas
  • 4,495
  • 3
  • 42
  • 60

1 Answers1

0

You have a single ClassPool in your application which has the monitor id 0x00000000db6cdb48.

If you see the method signature of ClassPool.get0:

protected synchronized CtClass get0(String classname, boolean useCache)

So it is synchronized. I suppose you simply used the ClassPool.getDefault(). You have to know that this method returns a single instance, so all of your calls will be sychronized.

Create a new pool for each thread (with new ClassPool(ClassPool.getDefault()) for example) and it will be fine then.

Apart from that you might check your secrurity manager, why it takes so long.

Gábor Lipták
  • 9,646
  • 2
  • 59
  • 113