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