java - 每个 getResourceAsStream 都会读取整个 jar

标签 java performance applet startup

我正在分析 java applet 的启动时间。我注意到,每次请求 jar 中的资源时,都会完全读取一个大小为 5MB 的巨大 jar。 例如。图像日志配置文件、I18N 文件等...... 它应该这样做吗?是否可以直接跳到正确的点?是否可以只读取该文件一次? 如果我切换到cache_archiv_ex并添加预加载指令会有帮助吗? 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()

最佳答案

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

关于java - 每个 getResourceAsStream 都会读取整个 jar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1969830/

相关文章:

android - 如何使用 Retrofit2 将照片上传到服务器

java - 目标小程序或 JVM 进程突然退出

java - 在命中 '/login' url 之前未检测到用户已登录

java - 我应该如何为这个函数编写 JUnit

java - 如何在 Play Framework 2.3.8 中保留字符串集合?

java - 选项卡式导航,将 Intent 附加信息传递给 fragment

有很多模型的 wpf 3d

c++ - 如何优化这个算法

macos - 浏览器中.class文件中的java版本号错误

java - 如何为小程序提供写入文件系统的访问权限