2

我正在分析一个 java 小程序启动时间。我注意到每次请求来自 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

4 回答 4

2

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

于 2009-12-28T15:08:55.997 回答
2

您还可以尝试使用创建 jar 文件的索引

jar -i "jar file"

并检查您是否仍然一直在传输大量数据。

于 2009-12-28T15:15:02.087 回答
0

这有点晚了,但也许有人仍在寻找这个问题的答案(就像我一样)。

我在这个论坛帖子中发现问题可能是由在创建新 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的方法。

希望这可以帮助。此致。

于 2013-10-04T11:19:38.737 回答
0

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

于 2009-12-28T20:43:02.610 回答