WebappClassLoader间歇性地需要12秒才能加载本地JAR文件

时间:2012-03-05 02:44:04

标签: java windows tomcat classloader

我遇到了一个无法在开发或测试环境中复制的生产问题。此外,由于它正在生产中,我无法在没有大量繁文缛节的情况下停止/启动Tomcat。

我在使用AudioSystem类的执行线程中观察到大约12秒(给出或花费500毫秒)的延迟。延迟是间歇性发生的,并且永远不会在几分钟之内发生。其他线程同时进行而没有问题。负载越高,延迟似乎越来越少。

通过使用JConsole线程选项卡,我可以在延迟发生时收集堆栈跟踪。 e.g。

Name: http-8081-Processor27
State: RUNNABLE
Total blocked: 134,991  Total waited: 23,132

Stack trace: 
java.util.zip.ZipFile.open(Native Method)
java.util.zip.ZipFile.<init>(Unknown Source)
java.util.jar.JarFile.<init>(Unknown Source)
java.util.jar.JarFile.<init>(Unknown Source)
org.apache.catalina.loader.WebappClassLoader.openJARs(WebappClassLoader.java:1789)
org.apache.catalina.loader.WebappClassLoader.findResources(WebappClassLoader.java:1019)
java.lang.ClassLoader.getResources(Unknown Source)
sun.misc.Service$LazyIterator.hasNext(Unknown Source)
com.sun.media.sound.JSSecurityManager$7.run(Unknown Source)
java.security.AccessController.doPrivileged(Native Method)
com.sun.media.sound.JSSecurityManager.getProviders(Unknown Source)
com.sun.media.sound.JDK13Services.getProviders(Unknown Source)
javax.sound.sampled.AudioSystem.getProviders(Unknown Source)
javax.sound.sampled.AudioSystem.getAudioFileReaders(Unknown Source)
javax.sound.sampled.AudioSystem.getAudioInputStream(Unknown Source)

看起来WebappClassLoader加载了JAR文件。我在开发环境中调整了这个类加载器,以便注销它正在加载的JAR。加载了55个JAR,全部来自本地磁盘,例如:

Fri Mar 02 17:02:04 EST 2012    About to open: E:\mycompany\Apps\Apache\Tomcat 5.5\webapps\application\WEB-INF\lib\log4j-1.2.15.jar

服务器配置错误的代理服务器。这在获取网页时可以可靠地产生12秒的延迟。但是,DEV和TEST环境也配置错误,但尚未显示延迟。这会导致Java在访问本地JAR文件时显示延迟吗?

Tomcat已经分配了1500MB的最大内存。 GC是ConcurrentMarkSweep,从不使用超过800MB。

服务器是使用Windows 2003,Tomcat 5.5.23,Java 1.5.0-v14构建的。任何有关正在发生的事情的线索都将非常感激。

1 个答案:

答案 0 :(得分:0)

听起来类加载器试图通过您的代理与互联网交谈。我会检查你配置类加载器的方式。请记住,类加载器将首先隐式委托其父类加载器链,因此您还需要检查它们。

如果您暂时告诉Java使用内部代理,这可能会帮助您找到问题所以您可以看到类加载器试图从互联网上获取的内容。