有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

有什么想法吗


共 (2) 个答案

  1. # 1 楼答案

    这绝对是愚蠢的,但在我重新启动我的机器后,问题就消失了:)我运行的是Windows 7、Oracle JDK 1.6/1.7、Tomcat 6/7,这三者的任何组合都存在问题。探查器向我显示,正是sun.net.www.protocol.jar.URLJarFile<init>减慢了整个过程。jars缓存可能出了问题,因此对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正确处理。然而,它极大地提高了性能!我仍然不知道这种行为的确切原因