1

我有一个包含大约 30 个 jar 的类路径目录。在我的普通控制台应用程序中,我正在创建一个我用指向所有这些 jarURLClassLoader的 s 列表初始化它的位置。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 中的一个简单 Web 请求触发doGet()。令人惊讶的是,加载平均类所需的时间延长了 10-15 倍,使得整个初始化时间无法接受。该问题至少适用于 Tomcat 版本 6 和 7。

有任何想法吗?

4

2 回答 2

0

这绝对是愚蠢的,但是在我重新启动机器后问题就消失了:) 我正在运行 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")

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

于 2013-08-02T13:18:59.530 回答
0

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

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

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

于 2013-08-01T06:20:50.360 回答