[英]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.