我正在分析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()
答案 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 的方法。
希望这会有所帮助。最诚挚的问候。