2012-02-22 91 views
4

我正在開發一個Java桌面應用程序,其中有許多緩存,例如對象池,緩存的JPanel等等。什麼時候是在Java中釋放緩存對象的好時機?

示例: 當用戶從一個面板切換到另一個面板時,如果用戶切換回來,我不會銷燬前一個面板。

但是,當系統處於這些內存資源的迫切需要,我消費這麼名正言順的應用程序內存消耗可能會高...

在iOS應用程序,我會釋放這些在「applicationDidReceiveMemoryWarning」方法。但在Java ...?

那麼,什麼時候在Java中釋放緩存對象是個好時機?

回答

7

緩存往往不是在Java中一個好主意 - 創建新的對象通常是比你想象的更便宜,而且通常會導致比保持緩存的「以防萬一」的對象更好的性能。有很多長壽命的物體對GC的性能不利,並且會給處理器緩存帶來相當大的壓力。

JPanels例如 - 足夠輕巧,可以在需要時創建一個全新的。

如果我是你,我會盡可能少的緩存越好,只有這樣做,當你證明這樣做了巨大的性能優勢。

即使您確實需要緩存,也請考慮使用使用Soft References的緩存 - 這樣,如果需要釋放內存,JVM將能夠自動從緩存中清除項目。這比嘗試推出自己的緩存策略更簡單,更安全。您可以使用現有的軟參引緩存實施,如Guava的CacheBuilder(感謝AlistairIsrael!)。

+0

那麼說 - 我會使用一個WeakReference,而不是真正'保持不軌'。 – 2012-02-22 04:56:55

+0

哇。我承認之前不知道這些。我搜索了一下,發現它非常有用。有點過時但很精彩的文章:http://weblogs.java.net/blog/2006/05/04/understanding-weak-references – Mazyod 2012-02-22 05:03:45

+0

+1提及軟引用。 – casablanca 2012-02-22 05:08:01

相關問題