Java根據需要加載資源。這使我的小小桌面應用程序在打開窗口時非常緩慢。如何在啓動應用程序時加載所有資源?
如何在啓動應用程序時加載所有資源?與類加載器有關嗎?
編輯:是否this code如果文件在jar中工作?
編輯2:請注意,目的不是爲了減少啓動時間,而是爲了減少應用程序啓動後新窗口打開的時間。我希望所有資源都能夠訪問內存並保持「可以使用」狀態,因此加載後應用程序將以更快的速度運行用戶的命令。
Java根據需要加載資源。這使我的小小桌面應用程序在打開窗口時非常緩慢。如何在啓動應用程序時加載所有資源?
如何在啓動應用程序時加載所有資源?與類加載器有關嗎?
編輯:是否this code如果文件在jar中工作?
編輯2:請注意,目的不是爲了減少啓動時間,而是爲了減少應用程序啓動後新窗口打開的時間。我希望所有資源都能夠訪問內存並保持「可以使用」狀態,因此加載後應用程序將以更快的速度運行用戶的命令。
問題比較難:代碼被初始化,如果使用它,甚至可以在方法級別上看到。所以你必須運行它來加載它。
唯一的另一種可能性是購買Excelsior Jet,它爲您編譯步驟(並返回一個不錯的.exe作爲副作用)。
編輯:你可以通過Class.forName()來減少你的運行時間,在啓動時加載你的所有類,並在需要時加載所有的類。請注意,爲了讓所有內容都真的很快,代碼必須已經運行,所以也許你可以打開,但隱藏,所有窗口,關閉它們,然後真正顯示所有其他窗口打開的主窗口。可悲的是,這會讓你的應用啓動非常慢。但它甚至可以在後臺完成,而用戶決定接下來要做什麼。
有沒有一種方法可以遍歷所有類而不需要明確寫出它們的名字? – 2010-05-26 20:36:58
請參閱我編輯的問題 – 2010-05-26 20:49:38
的目的不是爲了減少啓動時間,請參閱我的第二個更新 – 2010-05-28 13:36:37
如果你的意思是除了類文件之外的其他資源,那麼你可以使用proxy pattern延遲加載(延遲加載),直到你確實需要這些資源。
我想完全相反,在啓動時加載所有資源,以便在需要時可以在內存中快速訪問它們。 – 2010-05-27 13:42:30
Java根據需要加載資源。
實際上,它比這更復雜。如果你有一個類A
是靜態地依賴於一類B
是靜態地依賴於一類C
,然後加載A
將觸發渴望裝載B
和C
等。但是一些庫(我認爲AWT和Swing會這樣做)在內部使用Class.forName(...)
方法來延遲加載實現類。這減少了最初加載的類的數量,並且(理想情況下)避免加載應用程序永遠不會使用的代碼。
如何在啓動應用程序時加載所有資源?
我想你可以創建明確的靜態依賴關係來打敗上面的懶惰,但這可能不會讓你的應用程序的初始窗口更快地出現。更好的策略是嘗試使用更多的延遲加載來減少需要加載的代碼量,以使初始窗口可見。但是這需要明智地。如果您懶惰地加載初始窗口所需的類,則實際上可能會使啓動速度變慢。
編譯爲本機代碼(例如使用GCJ)是另一種選擇,但這有其不同的缺點;例如更大的二進制文件,更多的本機庫依賴項,可移植性問題(可能)對於長時間運行的應用程序來說執行速度較慢。
重新編輯:我認爲代碼將「工作」,但我看不出它可能如何加速應用程序的啓動。
「更好的策略是嘗試使用更多的延遲加載來減少需要加載的代碼量,以使初始窗口可見」。實際上,我並不關心最初的窗口顯示緩慢,我關心的是在顯示之後,所有其他窗口都需要準備好以快速方式顯示。我想要在應用程序啓動時加載到內存中的所有資源以便快速訪問。 (它不會用完內存,因爲它是一個小應用程序)。 – 2010-05-27 13:44:28
你問過你的用戶嗎?這是他們的想法嗎?無論如何 - 如果您認爲這是正確的做法,請按照我的建議添加靜態依賴關係。 – 2010-05-27 13:51:50
我看到他們在使用它,等待應用程序加載沒有任何問題。但是,在應用程序加載後,等待每次點擊你都會很頭疼......;) – 2010-05-28 13:25:35
在Windows 7上,並且與Java應用程序客戶端有類似的問題。任何延伸Gui(Frame,JFrame等)的東西都會花費一分鐘以上,只需要幾秒鐘就可以運行和加載。
將其追溯到在後臺運行的IIS(更新後?)。
從控制面板\程序\程序和功能停止其服務 - 打開和關閉Windows功能。
現在Java應用程序再次在幾秒鐘內加載。
希望其他人覺得這有幫助。 :-)
您是否嘗試使用JConsole進行連接並查看打開窗口時到底發生了什麼?如果它是一個類加載相關的瓶頸,那麼你會在'#類'圖上清楚地看到它。否則,您也可以嘗試更改JVM設置,這可能是內存不足或「服務器」JIT模式 – bobah 2010-05-26 20:24:46
@bobah它發生在我所有的桌面應用程序中,它不僅僅是這一個。 – 2010-05-27 13:38:22