(請注意,當我說「JVM」,我真的是「熱點」,和我運行最新的Java 1.6的更新。)鼓勵JVM進行GC而不是增加堆?
示例情況:
我的JVM與-Xmx集運行到1GB。目前,這個堆已經分配了500MB,其中使用了450MB。該程序需要在堆上加載另一個200 MB。目前,堆中有300mb的「可收集」垃圾(我們假設它全部是最老的一代)。
在正常操作下,JVM會將堆增長到700 MB左右,並且垃圾收集當它接近它時。
我想在這種情況下,JVM首先要gc,然後分配新的東西,這樣我們最終將堆大小保持在500mb,堆已用到350mb。
是否有一個JVM的參數組合,做了嗎?
在我看來,沒有必要釋放未使用的內存的概念是當今「現代」編程語言的主要問題。我分享Electrons_Ahoy的關切。不幸的是,電腦不再像以前那樣變得更快。我們必須編寫更好的軟件! – Seba 2011-03-18 18:05:27
如果你想忘記內存分配,這是一個折衷,沒有什麼可以阻止你使用C或C++並管理任何你想要的東西。但是,如果你選擇一個照顧自己以最佳方式行事的環境,那麼你就不應該試圖強迫自己的行爲。由於我們是在Java環境下,所以你的論證基本上沒有用處,也沒有人強迫你使用它:)這就像爭吵與某個擁有大污染汽車的人一樣,只是把你的自行車忘掉污染。 – Jack 2011-03-18 18:08:18
這可能是有用的,因爲當使用的堆更小時,完整的gc會更便宜。如果您可以在「fullGC now-> recover 500M->添加500M新對象」和「添加500M->觸發自動GC->恢復500M」之間進行選擇,那麼首先會更便宜。另外,儘管文檔明確聲明System.gc()將被視爲「一個建議」,但它確實起作用,就好像它被強制寫入我的有限混亂中一樣。這並不是一個好主意 - 一個1G的堆一個fullgc會導致一個明顯的掛起 - 至少幾秒鐘完全鎖定。 – 2011-03-18 18:10:16