Конфликт загрузчика классов при вызовах JAX-WS в Weblogic

Мы сталкиваемся со многими потоками, ожидающими за потоком ниже, который владеет блокировкой ClassLoader, как показано.

Это происходит в Weblogic 10.3.6, работающем на IBM JDK 1.7.

Я рассматривал возможность замены реализации Weblogic JAX-WS на более новую, но хотел бы иметь некоторые доказательства того, что она решит проблему, прежде чем идти по этому пути.

Я также вижу здесь Является ли этот клиентский вызов JAX-WS потокобезопасным? что прокси-классы не являются потокобезопасными. Как насчет использования экземпляров ThreadLocal прокси-классов? Или пул прокси-классов, похожий на KryoPool?

https://github.com/EsotericSoftware/kryo/blob/master/src/com/esotericsoftware/kryo/pool/KryoPool.java

Монитор

Owns Monitor Lock on 
java/lang/ClassLoader$ClassNameBasedLock@0x00000007D0BB0B18 , java/util/jar/JarFile@0x000000070300BD08

Стек Java

at java/util/zip/ZipFile.getEntryByModifiedUTF8(Native Method) 
at java/util/zip/ZipFile.getEntry(ZipFile.java:343(Compiled Code)) 
at java/util/jar/JarFile.getEntry(JarFile.java:305(Compiled Code)) 
at java/util/jar/JarFile.getJarEntry(JarFile.java:288(Compiled Code)) 
at sun/misc/URLClassPath$JarLoader.getResource(URLClassPath.java:1093(Compiled Code)) 
at sun/misc/URLClassPath.getResource(URLClassPath.java:330(Compiled Code)) 
at java/net/URLClassLoader$ClassFinder.run(URLClassLoader.java:1162(Compiled Code)) 
at java/security/AccessController.doPrivileged(AccessController.java:488) 
at java/net/URLClassLoader.findClass(URLClassLoader.java:595(Compiled Code)) 
at java/lang/ClassLoader.loadClassHelper(ClassLoader.java:786(Compiled Code)) 
at java/lang/ClassLoader.loadClass(ClassLoader.java:760(Compiled Code)) 
at sun/misc/Launcher$AppClassLoader.loadClass(Launcher.java:326(Compiled Code)) 
at java/lang/ClassLoader.loadClassHelper(ClassLoader.java:778(Compiled Code)) 
at java/lang/ClassLoader.loadClass(ClassLoader.java:764(Compiled Code)) 
at java/lang/ClassLoader.loadClass(ClassLoader.java:741(Compiled Code)) 
at com/sun/proxy/$Proxy162191.getCustomerDetails(Bytecode PC:21) 
at sun/reflect/GeneratedMethodAccessor574.invoke(Bytecode PC:42(Compiled Code)) 
at sun/reflect/DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:56(Compiled Code)) 
at java/lang/reflect/Method.invoke(Method.java:620(Compiled Code)) 
at weblogic/wsee/jaxws/spi/ClientInstanceInvocationHandler.invoke(ClientInstanceInvocationHandler.java:84(Compiled Code)) 
at com/sun/proxy/$Proxy636.getCustomerDetails(Bytecode PC:18(Compiled Code)) 
at sun/reflect/GeneratedMethodAccessor574.invoke(Bytecode PC:42(Compiled Code)) 
at sun/reflect/DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:56(Compiled Code)) 
at java/lang/reflect/Method.invoke(Method.java:620(Compiled Code)) 
at com/mycompany/util/webservice/PortFactory$PortCacheProxy.callMethodOnPort(PortFactory.java:317(Compiled Code)) 
at com/mycompany/util/webservice/PortFactory$PortCacheProxy.invoke(PortFactory.java:290(Compiled Code)) 
at com/sun/proxy/$Proxy637.getCustomerDetails(Bytecode PC:18(Compiled Code)) 
at com/mycompany/wsclient/customer/viewcustomerdetails/GetCustomerDetailsBaseOperation.call(GetCustomerDetailsBaseOperation.java:52(Compiled Code)) 
at com/mycompany/wsclient/customer/viewcustomerdetails/GetCustomerDetailsBaseOperation.call(GetCustomerDetailsBaseOperation.java:19(Compiled Code)) 
at com/mycompany/util/webservice/WebServiceOperation.call(WebServiceOperation.java:261(Compiled Code)) 
at com/mycompany/util/webservice/WebServiceOperationWork.run(WebServiceOperationWork.java:27(Compiled Code)) 
at weblogic/work/j2ee/J2EEWorkManager$WorkWithListener.run(J2EEWorkManager.java:184(Compiled Code)) 
at weblogic/work/ExecuteThread.execute(ExecuteThread.java:263(Compiled Code)) 
at weblogic/work/ExecuteThread.run(ExecuteThread.java:221(Compiled Code))

person rudolfv    schedule 24.11.2016    source источник
comment
Приложение зависает на этом этапе или оно в конечном итоге прогрессирует? Как часто это происходит: только при первой загрузке класса или чаще?   -  person Dan Heidinga    schedule 25.11.2016
comment
В этом случае сервер перешел в состояние отказа. Наше пороговое значение для пометки потока как застрявшего составляет 60 секунд, а количество переходов в состояние отказа составляет 100 застрявших потоков. Это периодически происходит в производстве, особенно с прокси-классами JAX-WS, я не видел, чтобы это происходило с другим кодом с тех пор, как мы обновились до JDK 1.7.   -  person rudolfv    schedule 25.11.2016