2013-10-16 33 views
1

只想知道我是否有單態對象,它具有非靜態映射。爲什麼地圖中的對象會佔用空間而不是堆。我從Visual VM中可以看出,Map pergem空間中的對象間歇會增加。每顆寶石內存單一模式

我所知道的只是靜態變量,而類在pergem空間中休息,所有的對象都應該去堆。

這是因爲singleton模式,其中singleton對象是靜態的,因此引用指向堆但仍保留pergem的大小?

如果是這種情況,這個問題的補救措施是什麼。

+1

單體內的任何字段實際上都是靜態的。單身人士只是混淆。 PermGen(在它存在的實現上)將充滿分配給它的對象 - 類數據和字符串。如果您正在重新加載類裝載器,則有可能您的靜態代碼阻止舊代碼被卸載。大多數GC活動都會忽略PermGen,因此您可能會發現其中的物體徘徊的時間比預期的要長。 –

+1

我會說使用單身人士是根本問題。如何切換到DI並使用[@Singleton](http://google-guice.googlecode.com/git/javadoc/com/google/inject/Singleton.html)? – maaartinus

回答

1

你的問題的答案是:是的。具體來說,任何時候[1]你直接或間接地從一個靜態變量中引用一個對象,那麼這個對象就不能被垃圾收集,並最終將被用於permgen。

解決方案是不使用單身。然而,這不會真正解決你的問題,因爲根據你的問題,你真正的問題是hashmap不斷增長。如果您將此用作某種形式的緩存,那麼您還需要按時間或大小設置緩存中的某種到期時間,否則它將持續增長,直到您獲得OOM。

[1]或多或少都是如此,在某些類加載器技巧的存在下這可能不是真的。