繁体   English   中英

Tomcat下URLClassLoader变慢

[英]URLClassLoader slow under Tomcat

我有一个包含大约30个jar的classpath目录。 在我的普通控制台应用程序中,我正在创建一个URLClassLoader ,在其中使用指向所有这些jar的URL列表对其进行初始化。

URL[] urls = new URL[] {
    new URL("jar:file:/D:/Work/temp/jars/antlr-2.7.7.jar!/"),
    new URL("jar:file:/D:/Work/temp/jars/aopalliance-1.0.jar!/"),
    new URL("jar:file:/D:/Work/temp/jars/c3p0-0.9.1.jar!/"),
    ...
}
URLClassLoader cl = new URLClassLoader(urls, getClass().getClassLoader());
Class<?> c = cl.loadClass(...);
etc...

这样,一切工作正常,需要花费几毫秒的时间从我的URLClassLoader加载单个类。

现在,我将这段代码片段使其在Tomcat下运行,例如在servlet的doGet()一个简单Web请求上触发。 令人惊讶的是,加载平均类所花费的时间变得更长10到15倍,从而使整个初始化时间变得无法接受。 该问题至少适用于Tomcat 6和7版本。

有任何想法吗?

尝试new URLClassLoader(urls); 这会提高性能吗?

Common和WebappX类加载器可能会影响加载类的性能。 请参阅以下链接以获取Tomcat的类加载器的更多详细信息。

http://tomcat.apache.org/tomcat-7.0-doc/class-loader-howto.html

这绝对是愚蠢的,但是当我重启机器后,问题就消失了:)我正在运行Windows 7,Oracle JDK 1.6 / 1.7,Tomcat 6/7,这些问题的任意组合仍然存在。 探查器向我显示的是sun.net.www.protocol.jar.URLJarFile<init> ,它使整个过程变慢。 jar缓存可能出了问题,因此对于jar请求的每个类都执行了不必要的初始化。

更新:我发现了如何解决此类问题,因为类加载如此之慢,并且只要不重新启动计算机就变得越来越慢。 而不是使用

new URL("jar:file:/D:/Work/temp/jars/antlr-2.7.7.jar!/")

我试过了

new URL("file:/D:/Work/temp/jars/antlr-2.7.7.jar")

即使未指定“ jar”协议, URLClassloader将此类URL正确处理为jar。 但是,它大大提高了性能! 我仍然不知道这种行为的确切原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM