2012-07-13 55 views
2

我試圖創建一個網站,有些時候我得到了PermGen異常。
所以我開始尋找方法來減少創建的對象的數量,並減少內存消耗。全球與本地(變量和列表)按字節消耗JAVA

我看了一些文章。但我不確定一些事情。
例如,在方法之外聲明列表(全局)還是在方法內部創建它們會更好?在這種情況下,內存消耗方面有什麼區別?如果我將它們聲明爲本地的,那麼在它們被使用後,垃圾收集器將收集它們並因此釋放堆中的空間?

任何人都可以提出一些方法來減少更多的內存消耗並減少創建對象的數量(@Autowired是一種更好的方式來聲明對象)?

+0

你[漏水類加載器(https://blogs.oracle.com/fkieviet/entry/more_on..._how_to_fix)? – GriffeyDog 2012-07-13 16:13:14

回答

5

如果您收到有關PermGen的內存不足例外情況,那麼減少對象的數量和大小很可能無濟於事(因爲它們將佔用Heap空間,而不是您的PermGen)

這個答案PermGen Out of Memory reasons應與PermGen的問題的原因幫助

1

靜態或非靜態數據在使用方面沒有區別。他們在堆上使用相同的數量。

如果運行了PermGen的,你要麼需要

  1. 負荷較少類
  2. 增加最大的PermGen大小如-XX:MaxPermSize=256m
2

全局變量和局部變量都佔用相同的內存量,不同之處在於它們超出範圍並因此獲得gargabe集合的資格。 全局變量不會超出範圍,而本地變量在「阻塞」(例如,方法或循環)完成後將立即超出範圍。如果現在沒有對該變量的引用,它將被垃圾收集器刪除。作爲一條經驗法則,總是試圖將變量放在最低可能範圍內,這將在變量不再使用時釋放變量。 如果可以的話,你應該嘗試重用變量。

這裏是一篇關於scope的小文章,一篇關於java垃圾收集器works和另一種收集器如何到use的。

0

只要聲明塊完成,就可以從垃圾收集器收集所有本地變量。所以這是內存回收的更好方法。