小心......如果您不謹慎,GC可能是一個多毛的問題。在任何運行時(JVM for Java/CLR for .Net)中,都有幾個進程發生。通常存在早期的記憶優化(年輕一代垃圾收集/年輕一代GC &舊代垃圾收集/老一代GC)。年輕的gen gc定期發生,並且通常歸因於您的較小暫停/打嗝。當你看到長時間「停止世界」停頓時,舊的gc通常會發生什麼。
爲什麼你會問?你的運行時/ JVM暫停的原因是,當運行時清理Heap時,它必須經歷所謂的相變。它會停止運行應用程序的線程,以便標記和交換指針以優化可用內存。永根更快,因爲它主要是釋放只是暫時的物體。然而,老一代對堆上的所有物體進行評估,當內存耗盡時,它會開始釋放所需的內存。
爲什麼要小心?老一代在暫停時間越來越糟,你使用的堆越多。在總堆大小爲2-4 GB時,在Java 6(JDK 1.6+)等現代運行時應該沒問題。一旦超越了這個閾值,你會看到暫停時間呈指數增長。我遇到了一些必須重新啓動服務器的客戶端,因爲在某些情況下堆很大,GC暫停時間可能比完全重新啓動時間要長。
有一些新的工具非常酷,可以給你評估GC是否是你的痛苦的領先優勢。 JHiccup是一個,它是免費的azulsystems網站。在這個時候,我認爲它只適用於Linux。他們也有一個JVM,它具有重新構建的GC算法,可以暫停運行...但是如果您使用的是非關鍵應用程序的單個服務器部署,那麼它可能不具有成本效益(這不是一個免費的)。總結 - 如果你的運行時/ JVM/CLR堆小於2 GB,增加更多的內存將有所幫助。一定要給自己一些開銷。如果可能的話,你永遠不會想要達到100%的堆大小/內存大小。那是長時間停頓最長的時候。給自己一個額外的20%以上的記憶,超出你認爲你需要的東西。這樣,您就有足夠的空間讓GC算法移動對象進行優化。如果你打算大規模......有一種工具可以修復大約1990年的JVM技術(Azul Systems Zing JVM),但它不是免費的。他們確實提供了一個開源工具來診斷GC問題。 JVM(我已經嘗試過了)也有一個非常酷的線程級可見性工具,可以讓你在沒有開銷的情況下報告生產中的任何泄漏,錯誤或鎖定(與JVM已經處理的數據卸載和時間戳有關的一些技巧)。這節省了大量的開發測試時間......但再次,不適用於小應用程序。
保持在4 GB以下。提供額外的空間。如果你願意,你可以打開這些標誌來監控的Java/JVM GC:
java -verbose:gc myProgram
java -Xloggc:D:/log/myLogFile.log -XX:+PrintGCDetails myProgram
您可以嘗試一些其他的收藏熱點使用的。有不止一個。
如果你在Linux上,繼續嘗試JHiccup工具。這是免費的。
我會指出,Azul Zing jvm在許多情況下「更具性能」。他們在應用程序運行時在幕後執行gC。非常酷的東西。再一次,它不是免費的,但對於那些希望取消調整JVM的人來說,這可以做到。我認爲他們稱之爲他們的C4收集器(併發,連續,壓縮,收集器?)。 Mike McCandless最近基準測試了Apache Lucene/Solr對CMS的測試。可伸縮性的巨大成果:http://blog.mikemccandless.com/2012/07/lucene-index-in-ram-with-azuls-zing-jvm.html我一直在關注這個,因爲它改變了遊戲 – 2012-09-07 14:19:36