每个getResourceAsStream都会读取整个jar

时间:2009-12-28 14:52:22

标签: java performance applet startup

我正在分析java applet的启动时间。我注意到每次请求来自jar的资源时,都会读取一个5MB大的jar。 例如。图像日志配置文件,I18N文件等.... 它应该这样吗?是否可以跳到正确的位置?是否可以只读取一次文件? 如果我将切换到cache_archiv_ex并添加一个preload指令会有帮助吗? jar文件打开位置的示例:

java.io.FileInputStream.open(String)
java.io.FileInputStream.<init>(File)
com.sun.deploy.cache.DeployCacheHandler$2.run()
java.security.AccessController.doPrivileged(PrivilegedExceptionAction)
com.sun.deploy.cache.DeployCacheHandler.get(URI, String, Map)
sun.net.www.protocol.http.HttpURLConnection.plainConnect()
sun.net.www.protocol.http.HttpURLConnection.connect()
sun.net.www.protocol.http.HttpURLConnection.getInputStream()
sun.plugin.PluginURLJarFileCallBack.downloadJAR(URLConnection, boolean)
sun.plugin.PluginURLJarFileCallBack.access$000(PluginURLJarFileCallBack, URLConnection, boolean)
sun.plugin.PluginURLJarFileCallBack$2.run()
java.security.AccessController.doPrivileged(PrivilegedExceptionAction)
sun.plugin.PluginURLJarFileCallBack.retrieve(URL)
sun.net.www.protocol.jar.URLJarFile.retrieve(URL, URLJarFile$URLJarFileCloseController)
sun.net.www.protocol.jar.URLJarFile.getJarFile(URL, URLJarFile$URLJarFileCloseController)
sun.net.www.protocol.jar.JarFileFactory.get(URL, boolean)
sun.net.www.protocol.jar.JarURLConnection.connect()
sun.plugin.net.protocol.jar.CachedJarURLConnection.connect()
sun.plugin.net.protocol.jar.CachedJarURLConnection.getInputStream()
java.net.URL.openStream()
java.lang.ClassLoader.getResourceAsStream(String)
sun.plugin2.applet.Applet2ClassLoader.getResourceAsStream(String)
..
.. (real application code stack...)
..
..
java.awt.event.InvocationEvent.dispatch()
java.awt.EventQueue.dispatchEvent(AWTEvent)
java.awt.EventDispatchThread.pumpOneEventForFilters(int)
java.awt.EventDispatchThread.pumpEventsForFilter(int, Conditional, EventFilter)
java.awt.EventDispatchThread.pumpEventsForHierarchy(int, Conditional, Component)
java.awt.EventDispatchThread.pumpEvents(int, Conditional)
java.awt.EventDispatchThread.pumpEvents(Conditional)
java.awt.EventDispatchThread.run()

4 个答案:

答案 0 :(得分:2)

getResourceAsStream正在调用CachedJarURLConnection。你确定它没有缓存jar并只下载一次吗?如果是,我会确保您的Web服务器每次都没有在jar上报告不同或不正确的上次更新日期。

答案 1 :(得分:2)

您还可以尝试使用

创建jar文件的索引
jar -i "jar file"

并检查您是否仍然可以随时转移这些数据。

答案 2 :(得分:0)

你需要一个applet吗?除非您需要在页面中嵌入Java应用程序,否则我建议使用Webstart

答案 3 :(得分:0)

这有点晚了,但也许有人还在寻找答案(就像我一样)。

我在this forum post中发现,在创建新的URLConnection时,调用一个名为 setDefaultUsecaches 的方法可能会导致问题:

URL url = new URL( urlString );  
URLConnection connection = url.openConnection();  
connection.setDoInput( true );  
connection.setDoOutput( true );  
connection.setDefaultUseCaches( false ); // <-- This is the problematic line

通过删除此行,我的所有jar都已正确缓存,应用程序启动变得非常快。

注意:如果需要,还有另一种名为 setUseCaches 的方法。

希望这会有所帮助。最诚挚的问候。