簡體   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