3 回答

TA貢獻1900條經驗 獲得超5個贊
似乎沒有人提到將對象引用顯式設置為null
,這是一種“釋放”您可能要考慮的內存的合法技術。
例如,假設您List<String>
在方法開始時就聲明了a ,該方法的大小會變得非常大,但只需要在方法進行到一半時才需要。此時,您可以將List引用設置為,null
以允許垃圾回收器在方法完成之前可能回收該對象(并且無論如何該引用都超出范圍)。
請注意,實際上我很少使用這種技術,但是在處理非常大的數據結構時值得考慮。

TA貢獻1785條經驗 獲得超4個贊
System.gc();
運行垃圾收集器。
調用gc方法表明,Java虛擬機將花費更多精力來回收未使用的對象,以使它們當前占用的內存可用于快速重用。當控件從方法調用返回時,Java虛擬機將盡最大努力從所有丟棄的對象中回收空間。
不建議。
編輯:我在2009年寫了原始回復?,F在是2015年。
在Java誕生的20多年來,垃圾收集器一直在穩步改善。此時,如果您要手動調用垃圾收集器,則可能需要考慮其他方法:
如果你強迫機器上數量有限GC,它可能是值得擁有的負載均衡點遠從目前的機器,等待它完成投放到連接的客戶端,超時一段時間后懸掛的連接,然后就硬-重新啟動JVM。這是一個糟糕的解決方案,但是如果您正在查看System.gc(),則強制重啟可能是一個權宜之計。
考慮使用其他垃圾收集器。例如,(過去六年中的新產品)G1收集器是一種低暫停時間模型;它總體上使用更多的CPU,但最好不要強迫執行硬停止。由于服務器CPU現在幾乎都具有多個內核,因此這是一個非常不錯的選擇。
查看調整內存使用情況的標志。尤其是在Java的較新版本中,如果沒有那么多長期運行的對象,請考慮增加堆中newgen的大小。newgen(年輕)是分配新對象的位置。對于Web服務器,為請求創建的所有內容都放在此處,如果此空間太小,Java將花費額外的時間將對象升級到壽命更長的內存,在這些內存中銷毀它們的代價更高。(如果newgen太小,您將為此付出代價。)例如,在G1中:
XX:G1NewSizePercent(默認為5;可能沒有關系。)
XX:G1MaxNewSizePercent(默認為60;可能會提高它。)
考慮告訴垃圾收集器您暫停較長時間后還不滿意。這將導致更頻繁的GC運行,以使系統保持其余約束。在G1中:
XX:MaxGCPauseMillis(默認為200。)
添加回答
舉報