3 回答

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

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