Tomcat下的java URLClassLoader
我有一个包含大约30个JAR的类路径目录。在我的普通控制台应用程序中,我创建了一个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
有什么想法吗
# 1 楼答案
这绝对是愚蠢的,但在我重新启动我的机器后,问题就消失了:)我运行的是Windows 7、Oracle JDK 1.6/1.7、Tomcat 6/7,这三者的任何组合都存在问题。探查器向我显示,正是
sun.net.www.protocol.jar.URLJarFile
的<init>
减慢了整个过程。jars缓存可能出了问题,因此对jar请求的每个类都执行了不必要的初始化更新: 我发现了如何解决类加载速度太慢的问题,只要你不重新启动机器,加载速度就会变得更慢。而不是使用
我试过了
即使没有指定“jar”协议,
URLClassloader
也可以将此类URL作为jar正确处理。然而,它极大地提高了性能!我仍然不知道这种行为的确切原因# 2 楼答案
试试
new URLClassLoader(urls);
。这会提高性能吗Common和WebappX类加载器可能会影响加载类的性能。有关Tomcat类加载器的更多详细信息,请参见以下链接
http://tomcat.apache.org/tomcat-7.0-doc/class-loader-howto.html