2015-10-14 25 views
2

我正在使用Java持久性API來開發獨立軟件。最近我看到,當我從實體類以及JPAController類創建對象時,內存使用量不斷增加。由於分配給項目的內存不會減少(例如:400mb --->創建對象---> 450mb --->停留在450mb),所以對象似乎停留在內存中。這會對性能造成嚴重影響嗎?我應該調用System.gc()方法來刪除這些對象嗎?我應該在我的java持久性項目中調用System.gc()嗎?

+0

你如何測量內存分配? – biziclop

+1

不,幾乎沒有理由調用System.gc();它不會解決您將遇到的任何問題。 – Kayaman

+0

@biziclop我使用Windows任務管理器,我可以看到在Java(TM)平臺二進制文件下的內存分配 – Thanuj

回答

5

通常System.gc()不保證執行垃圾回收。最終由JVM決定。請參閱javadoc

您是否觀察到當您接近JVM的內存限制時會發生什麼,然後發生垃圾回收?如果沒有,並且您收到一個OutOfMemoryError,則您要麼保留比您需要的時間更長的時間,要麼實際上需要爲虛擬機分配額外的堆。

在任何情況下System.gc()我相信不應該用來解決這些問題。

+0

簡短明瞭... +1 –

+0

@Damien是的,我意識到使用System.gc()實際上會減慢一些進程。感謝你的回答。 :) – Thanuj

4

在我看來,解決問題的方法應該是不同的。實際上對System.gc()的調用並不能保證它完全釋放任何內存;請參閱When does System.gc() do anything

如果您可以通過jconsole測量內存分配中的問題,或者對jvm轉儲進行事後分析或其他任何操作,那麼這是另一個問題。通過收集這些信息,您將知道內存區域中的哪些地方仍然存在,然後採取行動來控制它。

1

這會對程序整個生命週期的性能造成負面影響的唯一方法是,如果您希望永久保留這些實體,但堆中舊一代的大小小於您指定的450MB。假設你想保持你永久指定的450MB的1到2倍,並且默認的JVM比率,設置一個參數(例如-Xmx2g)可能會很好。除此之外,還有更多的參數可以更好地調整您的性能,但這可能是您現在要查找的所有複雜性。如果您想查看堆調整的更多細節並真正進入性能,請參閱Garbage Collection Tuning by Oracle上的此文檔。另外,吃午餐的東西是一個偉大的Youtube video on GC tuning by a guy named Gil Tene

但是調用System.gc()可能不會做任何有用的事情。

相關問題