classpath
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Deadlock in java.net.URLClassLoader


From: Andrew Haley
Subject: Deadlock in java.net.URLClassLoader
Date: Thu, 18 Aug 2005 13:03:59 +0100

Another Deadlock.

What happens is that one thread does ClassLoader.loadClass, which is
synchronized on the loader, and then URLClassLoader calls toString(),
which is synchronized on urlloaders.

Meanwhile, someone calls URLClassLoader.addURL(), which is
synchronized on urlloaders.  This calls Connection.getJarFile() and
that eventually gets to BytesToUnicode.getDecoder(), which calls
ClassLoader.findLoadedClass(), which is synchronized on the loader.

So, one thread does

  loader, urlloaders

and the other thread does

  urlloaders, loader

wit the inevitable consequence.

The real problem is that we are synchronized on urlloaders for far too
long.

Andrew.

Index: URLClassLoader.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/net/URLClassLoader.java,v
retrieving revision 1.27.2.2
diff -u -p -r1.27.2.2 URLClassLoader.java
--- URLClassLoader.java 4 Jun 2005 11:27:15 -0000       1.27.2.2
+++ URLClassLoader.java 18 Aug 2005 12:01:37 -0000
@@ -902,6 +902,23 @@ public class URLClassLoader extends Secu
              }
          }
 
+       {
+         StringBuffer sb = new StringBuffer();
+         sb.append(this.getClass().getName());
+         sb.append("{urls=[" );
+         URL[] thisURLs = getURLs();
+         for (int i = 0; i < thisURLs.length; i++)
+           {
+             sb.append(thisURLs[i]);
+             if (i < thisURLs.length - 1)
+               sb.append(',');
+           }
+         sb.append(']');
+         sb.append(", parent=");
+         sb.append(getParent());
+         sb.append('}');
+         thisString = sb.toString();
+       }       
       }
   }
 
@@ -1086,28 +1103,7 @@ public class URLClassLoader extends Secu
    */
   public String toString()
   {
-    synchronized (urlloaders)
-      {
-       if (thisString == null)
-         {
-           StringBuffer sb = new StringBuffer();
-           sb.append(this.getClass().getName());
-           sb.append("{urls=[" );
-           URL[] thisURLs = getURLs();
-           for (int i = 0; i < thisURLs.length; i++)
-             {
-               sb.append(thisURLs[i]);
-               if (i < thisURLs.length - 1)
-                 sb.append(',');
-             }
-           sb.append(']');
-           sb.append(", parent=");
-           sb.append(getParent());
-           sb.append('}');
-           thisString = sb.toString();
-         }
-       return thisString;
-      }
+    return thisString;
   }
 
   /**



Thread 89 (Thread 104762288 (LWP 2871)):
#0  0x001184c1 in ?? () from /lib/libpthread.so.0
#1  0x02a58a5c in _Jv_CondWait (address@hidden, address@hidden, millis=0, 
nanos=0)
    at /home/aph/gcc-4_0-branch/gcc/libjava/posix-threads.cc:152
#2  0x0272f18a in _Jv_MonitorEnter (address@hidden) at 
/home/aph/gcc-4_0-branch/gcc/libjava/java/lang/natObject.cc:944
#3  0x0286b877 in java.net.URLClassLoader.toString() (address@hidden)
    at /home/aph/gcc-4_0-branch/gcc/libjava/java/net/URLClassLoader.java:1088
#4  0x027594c4 in java.lang.String.valueOf(java.lang.Object) (address@hidden)
    at /home/aph/gcc-4_0-branch/gcc/libjava/java/lang/String.java:1103
#5  0x027c7e3d in gnu.gcj.runtime.StringBuffer.append(java.lang.Object) 
(address@hidden, address@hidden)
    at 
/home/aph/gcc-4_0-branch/gcc/libjava/gnu/gcj/runtime/StringBuffer.java:122
#6  0x0286b3d9 in java.net.URLClassLoader.findClass(java.lang.String) 
(address@hidden, address@hidden)
    at /home/aph/gcc-4_0-branch/gcc/libjava/java/net/URLClassLoader.java:986
#7  0x027c3c1e in 
gnu.gcj.runtime.BootClassLoader.bootLoadClass(java.lang.String) 
(address@hidden, address@hidden)
    at 
/home/aph/gcc-4_0-branch/gcc/libjava/gnu/gcj/runtime/BootClassLoader.java:55
#8  0x02734dff in java::lang::VMClassLoader::loadClass (address@hidden, 
resolve=0)
    at /home/aph/gcc-4_0-branch/gcc/libjava/java/lang/natVMClassLoader.cc:206
#9  0x02749e3f in java.lang.ClassLoader.loadClass(java.lang.String, boolean) 
(address@hidden, address@hidden, resolve=false)
    at /home/aph/gcc-4_0-branch/gcc/libjava/java/lang/ClassLoader.java:304
#10 0x02749e13 in java.lang.ClassLoader.loadClass(java.lang.String, boolean) 
(address@hidden, address@hidden, resolve=false)
    at /home/aph/gcc-4_0-branch/gcc/libjava/java/lang/ClassLoader.java:310
#11 0x02749e13 in java.lang.ClassLoader.loadClass(java.lang.String, boolean) 
(address@hidden, address@hidden, resolve=false)
    at /home/aph/gcc-4_0-branch/gcc/libjava/java/lang/ClassLoader.java:310
#12 0x02749e13 in java.lang.ClassLoader.loadClass(java.lang.String, boolean) 
(address@hidden, address@hidden, resolve=false)
    at /home/aph/gcc-4_0-branch/gcc/libjava/java/lang/ClassLoader.java:310
#13 0x02749e13 in java.lang.ClassLoader.loadClass(java.lang.String, boolean) 
(address@hidden, address@hidden, resolve=false)
    at /home/aph/gcc-4_0-branch/gcc/libjava/java/lang/ClassLoader.java:310
#14 0x02749aae in java.lang.ClassLoader.loadClass(java.lang.String) 
(address@hidden, address@hidden)
    at /home/aph/gcc-4_0-branch/gcc/libjava/java/lang/ClassLoader.java:260
#15 0x0272cc2d in _Jv_FindClass (address@hidden, address@hidden)
    at /home/aph/gcc-4_0-branch/gcc/libjava/java/lang/natClassLoader.cc:242
#16 0x026f551a in _Jv_FindClassFromSignature (sig=Variable "sig" is not 
available.
) at /home/aph/gcc-4_0-branch/gcc/libjava/prims.cc:722
#17 0x02703698 in _Jv_Linker::verify_type_assertions (address@hidden) at 
/home/aph/gcc-4_0-branch/gcc/libjava/link.cc:1623
#18 0x026f759d in _Jv_CompiledEngine::do_verify (address@hidden) at 
/home/aph/gcc-4_0-branch/gcc/libjava/include/execution.h:49
#19 0x027031d5 in _Jv_Linker::verify_class (address@hidden) at 
/home/aph/gcc-4_0-branch/gcc/libjava/link.cc:1589
#20 0x02704483 in _Jv_Linker::wait_for_state (address@hidden, state=9) at 
/home/aph/gcc-4_0-branch/gcc/libjava/link.cc:1740
#21 0x02734eb6 in java::lang::VMClassLoader::resolveClass (address@hidden)
    at /home/aph/gcc-4_0-branch/gcc/libjava/java/lang/natVMClassLoader.cc:44
#22 0x0272bf7e in java::lang::Class::initializeClass (this=Variable "this" is 
not available.
) at /home/aph/gcc-4_0-branch/gcc/libjava/java/lang/natClass.cc:728
#23 0x026f5f90 in _Jv_AllocObjectNoFinalizer (klass=Variable "klass" is not 
available.
) at /home/aph/gcc-4_0-branch/gcc/libjava/java/lang/Class.h:579
#24 0x07beabd1 in 
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.init() 
(address@hidden)
    at org/apache/coyote/http11/Http11Protocol.java:647
#25 0x05b71525 in org.apache.tomcat.util.net.TcpWorkerThread.getInitData() 
(address@hidden)
    at org/apache/tomcat/util/net/PoolTcpEndpoint.java:527
#26 0x05b7a932 in 
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run() (address@hidden)
    at org/apache/tomcat/util/threads/ThreadPool.java:673
#27 0x0275c285 in java.lang.Thread.run() (address@hidden) at 
/home/aph/gcc-4_0-branch/gcc/libjava/java/lang/Thread.java:653
#28 0x0273459b in _Jv_ThreadRun (address@hidden) at 
/home/aph/gcc-4_0-branch/gcc/libjava/java/lang/natThread.cc:289
#29 0x02a58f60 in really_start (address@hidden) at 
/home/aph/gcc-4_0-branch/gcc/libjava/posix-threads.cc:403
#30 0x02b3a68a in GC_start_routine (address@hidden) at 
/home/aph/gcc-4_0-branch/gcc/boehm-gc/pthread_support.c:1185
#31 0x0011694f in start_thread (address@hidden) at pthread_create.c:261
#32 0x006fd97e in ?? () from /lib/libc.so.6

Thread 1 (Thread -1208113488 (LWP 2772)):
#0  0x001184c1 in ?? () from /lib/libpthread.so.0
#1  0x02a58a5c in _Jv_CondWait (cv=0xb5f4066c, mu=0xb5f40670, millis=0, nanos=0)
    at /home/aph/gcc-4_0-branch/gcc/libjava/posix-threads.cc:152
#2  0x0272f18a in _Jv_MonitorEnter (obj=0x79f88) at 
/home/aph/gcc-4_0-branch/gcc/libjava/java/lang/natObject.cc:944
#3  0x02749ad5 in java.lang.ClassLoader.findLoadedClass(java.lang.String) 
(this=0x79f88, name=0xfffffffc)
    at /home/aph/gcc-4_0-branch/gcc/libjava/java/lang/ClassLoader.java:528
#4  0x0272cbf1 in _Jv_FindClass (name=0xb83a28, loader=0x0)
    at /home/aph/gcc-4_0-branch/gcc/libjava/java/lang/natClassLoader.cc:234
#5  0x0272c12d in java::lang::Class::forName (className=0xb5c3fdf8, 
initialize=Variable "initialize" is not available.
)
    at /home/aph/gcc-4_0-branch/gcc/libjava/java/lang/natClass.cc:89
#6  0x0272c25e in java::lang::Class::forName (className=0xfffffffc)
    at /home/aph/gcc-4_0-branch/gcc/libjava/java/lang/natClass.cc:119
#7  0x02a26af9 in gnu.gcj.convert.BytesToUnicode.getDecoder(java.lang.String) 
(encoding=0x41a00)
    at 
/home/aph/gcc-4_0-branch/gcc/libjava/gnu/gcj/convert/BytesToUnicode.java:99
#8  0x0276942d in 
java.io.InputStreamReader.InputStreamReader(java.io.InputStream, 
java.lang.String) (this=0xfffffffc, 
    in=0xfffffffc, encoding_name=0xfffffffc) at 
/home/aph/gcc-4_0-branch/gcc/libjava/java/io/InputStreamReader.java:130
#9  0x028ad0b3 in java.util.jar.Manifest.read(java.io.InputStream) 
(this=0xb5ee57a0, in=0xfffffffc)
    at /home/aph/gcc-4_0-branch/gcc/libjava/java/util/jar/Manifest.java:163
#10 0x028ac721 in java.util.jar.Manifest.Manifest(java.io.InputStream) 
(this=0xb5ee57a0, in=0xfffffffc)
    at /home/aph/gcc-4_0-branch/gcc/libjava/java/util/jar/Manifest.java:93
#11 0x028a9c57 in java.util.jar.JarFile.readManifest() (this=0xb5ee20c8)
    at /home/aph/gcc-4_0-branch/gcc/libjava/java/util/jar/JarFile.java:286
#12 0x028a9de6 in java.util.jar.JarFile.JarFile(java.lang.String, boolean) 
(this=0xb5ee20c8, fileName=0xfffffffc, verify=true)
    at /home/aph/gcc-4_0-branch/gcc/libjava/java/util/jar/JarFile.java:185
#13 0x028a9e2d in java.util.jar.JarFile.JarFile(java.lang.String) 
(this=0xfffffffc, fileName=0xfffffffc)
    at /home/aph/gcc-4_0-branch/gcc/libjava/java/util/jar/JarFile.java:163
#14 0x02810d50 in gnu.java.net.protocol.jar.Connection.getJarFile() 
(this=0xb67a6e70)
    at 
/home/aph/gcc-4_0-branch/gcc/libjava/gnu/java/net/protocol/jar/Connection.java:212
#15 0x0286a666 in 
java.net.URLClassLoader$JarURLLoader.URLClassLoader$JarURLLoader(java.net.URLClassLoader,
 java.net.URL) (
    this=0x52cb60, classloader=0xb646c600, baseURL=0xb5ee2168)
    at /home/aph/gcc-4_0-branch/gcc/libjava/java/net/URLClassLoader.java:331
#16 0x0286b129 in java.net.URLClassLoader.addURLImpl(java.net.URL) 
(this=0xb646c600, newUrl=0xb5ee2168)
    at /home/aph/gcc-4_0-branch/gcc/libjava/java/net/URLClassLoader.java:878
#17 0x0286b16b in java.net.URLClassLoader.addURL(java.net.URL) 
(this=0xb646c600, newUrl=0xb5ee2168)
    at /home/aph/gcc-4_0-branch/gcc/libjava/java/net/URLClassLoader.java:853
#18 0x01376960 in 
org.objectweb.jonas_lib.loader.AbsModuleClassLoader.addContentInRepository(java.lang.String)
 (
    this=0xb646c600, location=0xb67a7e10) at 
org/objectweb/jonas_lib/loader/AbsModuleClassLoader.java:134
#19 0x01377555 in org.objectweb.jonas_lib.loader.WebappClassLoader.init() 
(this=0xb646c600)
    at org/objectweb/jonas_lib/loader/WebappClassLoader.java:79
#20 0x013765b0 in 
org.objectweb.jonas_lib.loader.AbsModuleClassLoader.AbsModuleClassLoader(java.net.URL[],
 java.lang.ClassLoader) (this=0xb646c600, modules=0x5f, parent=0x5f) at 
org/objectweb/jonas_lib/loader/AbsModuleClassLoader.java:80
#21 0x01377150 in 
org.objectweb.jonas_lib.loader.SimpleWebappClassLoader.SimpleWebappClassLoader(java.net.URL,
 java.lang.ClassLoader) (this=0xfffffffc, module=0xb3e38, parent=0xfffffffc) at 
org/objectweb/jonas_lib/loader/SimpleWebappClassLoader.java:65
#22 0x013774fc in 
org.objectweb.jonas_lib.loader.WebappClassLoader.WebappClassLoader(java.net.URL,
 java.lang.ClassLoader) (
    this=0xfffffffc, module=0xfffffffc, parent=0xfffffffc) at 
org/objectweb/jonas_lib/loader/WebappClassLoader.java:68
#23 0x012a0694 in 
org.objectweb.jonas.web.AbsJWebContainerServiceImpl.getClassLoader(java.net.URL,
 java.lang.String, java.lang.ClassLoader) (this=0x3c5cf00, warURL=0xb3f00, 
earAppName=0x5f, parentLoader=0x0)
    at org/objectweb/jonas/web/AbsJWebContainerServiceImpl.java:536
#24 0x012a0b0d in 
org.objectweb.jonas.web.AbsJWebContainerServiceImpl.registerWar(javax.naming.Context)
 (this=0x3c5cf00, 
    ctx=0x5034f0) at 
org/objectweb/jonas/web/AbsJWebContainerServiceImpl.java:644
#25 0x0129fa33 in org.objectweb.jonas.web.AbsJWebContainerServiceImpl.doStart() 
(this=0x3c5cf00)
    at org/objectweb/jonas/web/AbsJWebContainerServiceImpl.java:368
#26 0x00fbfd48 in 
org.objectweb.jonas.web.catalina50.CatalinaJWebContainerServiceImpl.doStart() 
(this=0x3c5cf00)
    at 
org/objectweb/jonas/web/catalina50/CatalinaJWebContainerServiceImpl.java:304
#27 0x01298ccc in org.objectweb.jonas.service.AbsServiceImpl.start() 
(this=0x3c5cf00)
    at org/objectweb/jonas/service/AbsServiceImpl.java:80
#28 0x02b1ec5f in ffi_call_SYSV () at 
/home/aph/gcc-4_0-branch/gcc/libffi/src/x86/sysv.S:60
#29 0x02b1e8d3 in ffi_call (cif=dwarf2_read_address: Corrupted DWARF expression.
) at /home/aph/gcc-4_0-branch/gcc/libffi/src/x86/ffi.c:221
#30 0x027382a5 in _Jv_CallAnyMethodA (obj=0x3c5cf00, return_type=0x2fc8460, 
meth=0x15ed6e8, is_constructor=0 '\0', 
    is_virtual_call=1 '\001', parameter_types=0x4171420, args=0xbffff0a0, 
result=0xbffff0f4, is_jni_call=0 '\0', iface=0x0)
    at /home/aph/gcc-4_0-branch/gcc/libjava/java/lang/reflect/natMethod.cc:516
#31 0x02738809 in _Jv_CallAnyMethodA (obj=0xfffffffc, return_type=0x2fc8460, 
meth=0x15ed6e8, is_constructor=0 '\0', 
    parameter_types=0x4171420, args=0x4171428, iface=0xfffffffc)
    at /home/aph/gcc-4_0-branch/gcc/libjava/java/lang/reflect/natMethod.cc:651
#32 0x02738c91 in java::lang::reflect::Method::invoke (this=0x440ae80, 
obj=0x3c5cf00, args=0xfffffffc)
    at /home/aph/gcc-4_0-branch/gcc/libjava/java/lang/reflect/natMethod.cc:193
#33 0x012aad94 in 
org.objectweb.jonas.web.wrapper.CatalinaJWebContainerServiceWrapper.invoke(java.lang.reflect.Method,
 java.lang.Object[]) (this=0x3d56b10, m=0x440ae80, params=0xfffffffc)
    at 
org/objectweb/jonas/web/wrapper/CatalinaJWebContainerServiceWrapper.java:156
#34 0x012aca37 in 
org.objectweb.jonas.web.wrapper.CatalinaJWebContainerServiceWrapper.start() 
(this=0x3d56b10)
    at 
org/objectweb/jonas/web/wrapper/CatalinaJWebContainerServiceWrapper.java:527
#35 0x007cf37b in org.objectweb.jonas.service.ServiceManager.startServices() 
(this=0x3cdd520)
    at org/objectweb/jonas/service/ServiceManager.java:313
#36 0x01297c47 in org.objectweb.jonas.server.Server.start() (this=0x9ecba0) at 
org/objectweb/jonas/server/Server.java:555
#37 0x01296ad5 in org.objectweb.jonas.server.Server.main(java.lang.String[]) 
(args=0x2bfb0)
    at org/objectweb/jonas/server/Server.java:179
#38 0x02b1ec5f in ffi_call_SYSV () at 
/home/aph/gcc-4_0-branch/gcc/libffi/src/x86/sysv.S:60
#39 0x02b1e8d3 in ffi_call (cif=dwarf2_read_address: Corrupted DWARF expression.
) at /home/aph/gcc-4_0-branch/gcc/libffi/src/x86/ffi.c:221
#40 0x027382a5 in _Jv_CallAnyMethodA (obj=0x0, return_type=0x2fc8460, 
meth=0x15ecae8, is_constructor=0 '\0', 
    is_virtual_call=0 '\0', parameter_types=0x24ba0, args=0xbffff490, 
result=0xbffff4f0, is_jni_call=0 '\0', iface=0x0)
    at /home/aph/gcc-4_0-branch/gcc/libjava/java/lang/reflect/natMethod.cc:516
#41 0x02738809 in _Jv_CallAnyMethodA (obj=0xfffffffc, return_type=0x2fc8460, 
meth=0x15ecae8, is_constructor=0 '\0', 
    parameter_types=0x24ba0, args=0x24bb0, iface=0xfffffffc)
    at /home/aph/gcc-4_0-branch/gcc/libjava/java/lang/reflect/natMethod.cc:651
#42 0x02738c91 in java::lang::reflect::Method::invoke (this=0xa912c0, obj=0x0, 
args=0xfffffffc)
    at /home/aph/gcc-4_0-branch/gcc/libjava/java/lang/reflect/natMethod.cc:193
#43 0x00fecdbb in org.objectweb.jonas.server.Bootstrap.main(java.lang.String[]) 
(args=0x24fe0)
    at org/objectweb/jonas/server/Bootstrap.java:97
#44 0x02724493 in gnu::java::lang::MainThread::call_main (this=0x79dc8)
    at /home/aph/gcc-4_0-branch/gcc/libjava/gnu/java/lang/natMainThread.cc:47
#45 0x027ca912 in gnu.java.lang.MainThread.run() (this=0x79dc8)
    at /home/aph/gcc-4_0-branch/gcc/libjava/gnu/java/lang/MainThread.java:105
#46 0x0273459b in _Jv_ThreadRun (thread=0x79dc8) at 
/home/aph/gcc-4_0-branch/gcc/libjava/java/lang/natThread.cc:289
#47 0x026f71cd in _Jv_RunMain (vm_args=0xfffffffc, klass=0x0, name=0xbffffe3c 
"org.objectweb.jonas.server.Bootstrap", argc=Variable "argc" is not available.
)
    at /home/aph/gcc-4_0-branch/gcc/libjava/prims.cc:1353
#48 0x00101a0d in main () from /usr/lib/libgij.so.6
#49 0x0065241d in __libc_start_main (main=0x80483f4, argc=20, 
ubp_av=0xbffff944, init=0x80484e4, fini=0x8048534, 
    rtld_fini=0x62e9dc <_dl_fini>, stack_end=0xbffff93c) at 
../sysdeps/generic/libc-start.c:231
#50 0x08048461 in ?? ()




reply via email to

[Prev in Thread] Current Thread [Next in Thread]