2009-12-28 84 views
2

我正在分析java applet的啓動時間。我注意到,每次請求來自jar的資源時,都會讀取一個大小爲5MB的大容量jar文件。 例如圖像日誌配置文件,I18N文件等... 它應該這樣做?是否有可能跳到正確的點?是否有可能只讀取一次文件? 如果我將切換到cache_archiv_ex並添加預加載指令,它會有幫助嗎? jar文件被打開,其中的實施例 :爲每個getResourceAsStream讀取整個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() 

回答

2

的getResourceAsStream正在呼叫CachedJarURLConnection。你確定它沒有緩存jar,只下載一次?如果是這樣,我會確保您的Web服務器每次都不報告jar上的不同或不正確的最後更新日期。

+0

對'FileInputStream'的引用強烈表明(從緩存而不是套接字讀取)確實正在發生。對我來說有趣的是,一個Java應用程序通常使用內存映射它的jar文件。雖然我可以理解爲什麼applet容器不會這樣做,但是可能有一個JRE中的設置可以啓用它(但我沒看過)。 – kdgregory 2009-12-28 18:36:22

+0

它正在從文件中讀取。我在分析過程時看到它Yourkit 9.0 EAP有一個很好的功能,稱爲探針,顯示讀取的文件和讀取的數據量。 – lifey 2009-12-28 19:33:31

+0

您能解釋一下在applet中不使用內存映射文件的原因嗎? – lifey 2009-12-28 19:35:27

2

你也可以嘗試創建索引的jar文件與

jar -i "jar file" 

,並檢查是否仍然獲取量的數據轉移所有的時間。

0

你需要一個小程序嗎?除非您需要將Java應用程序嵌入到頁面中,否則我建議使用Webstart

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 

通過刪除這一行,我所有的罐子被正確緩存和應用程序開始變得閃電般快速。

注意:還有另一種方法稱爲setUseCaches萬一您需要它。

希望這會有所幫助。最好的祝福。

相關問題