2011-10-27 30 views
0

應該採用什麼策略來確保JVM內存管理總是很快?應該採用什麼策略來確保JVM內存管理始終快速?

我通過Timer#scheduleAtFixedRate()定期運行一個方法,每10秒鐘一次,週期性方法通常需要5到50毫秒,但偶爾會更長。除了這個週期性的方法,應用程序沒有其他任何事情要做。有時超過10秒。由於應用程序的性質不會或不應該導致流逝時間的巨大變化,我認爲這種變化是由垃圾收集引起的。我如何始終保持垃圾收集在10秒以內?

週期方法每隔10秒在圖上建立列表和圖表點並持續幾個小時。在幾個小時的時間結束時,它會對整個時間收集的所有數據進行一些二進制序列化。

我試着用System.gc()來結束週期性方法,但我仍然得到超過10秒的方法運行。 10秒運行後,它將回到5毫秒運行時間的方法運行。然後它會逐漸花費更長的時間,直到經過約10秒的時間。然後循環重複。我也看到了其他模式。

您可能想知道如果方法花費的時間比在scheduleAtFixedRate()中設置的時間長,會發生什麼情況。會發生什麼是下一次調用被延遲(沒有中止正在進行的方法,也沒有嘗試通過使用另一個線程來堅持時間表)。如果緩慢的運行持續下去,我想那裏會有大量積壓。幸運的是,長時間的運行只是偶爾發生,大部分時間僅在5到50毫秒之間。不過,我不想要這些長時間的運行,因爲它們破壞了週期性。

一個快速解決方法是將我的週期更改爲15秒,從而確保週期大於最壞情況經過的時間。這只是一個解決方法。在垃圾回收中獲得一致性會好得多。

+0

你有**任何**證明這次是在GC上花費的嗎?嘗試分析它。大多數JVM的垃圾收集器都是一流的GC算法實現。除非你有20GB的堆,並且你的代碼什麼都不做,只是分配10GB的對象,並在10ms後將它們變成垃圾,否則即使是一秒鐘的GC暫停也是不正常的。 – delnan

+0

你不需要分析它是否是GC,只需做一些暫停時間記錄和gc記錄(即'-XX:+ PrintGCDetails -XX:+ PrintGCDateStamps -XX:+ PrintGCApplicationStoppedTime -XX:+ PrintGCApplicationConcurrentTime -verbose :gc')。在你通過標準技術展示它之前,你的聲明絕對沒有可信度:「我認爲這種變化是由於垃圾收集造成的」 – Matt

+0

我沒有看到它發生在最近的壓力測試中。我現在正在分析和GC日誌記錄,所以現在我等着看。 – H2ONaCl

回答

0

要通過折衷效率來減少耗用時間,請在您的java調用命令行上使用JVM選項-Xincgc。

相關問題