2011-12-15 51 views
0

假設我有一個有內存泄漏的應用程序。在某些時候,GC會努力清除內存,並會減慢我的應用程序。我知道,如果你設置這個參數爲JVM -XX:-UseGCOverheadLimit它會拋出一個OutOfMemoryException:如何防止垃圾收集器減慢我的應用程序

如果總時間的98%以上都花在垃圾收集和堆小於2%被恢復。

但是,這對我來說還不夠好。因爲即使在這些數字出現之前,我的應用程序也會變得很慢在拋出OutOfMemoryException之前,GC會吸收CPU一段時間。我的目標是在某種程度上很早就認識到如果最可能出現問題,然後拋出OutOfMemoryexception。之後我有一些恢復策略。

好吧,現在我已經發現了這兩個附加參數GCTimeLimit和GCHeapFreeLimit。有了它們,可以調整兩個引用常量(98%和2%)。

我對自己做了一些測試,就像產生內存泄漏並使用這些設置玩的一小段代碼。但我不確定如何找到正確的折衷方案。我的希望是,別人有同樣的問題,並提出了一個合理的解決方案,或者還有一些我還不知道的其他GC開關。

我感覺有點失落,因爲我不是這個話題的專家,而且似乎有很多事情是可以考慮的。

+9

而不是試圖擊敗垃圾回收器,也許你應該修補內存泄漏? – Bueller 2011-12-15 22:42:54

+3

修復內存泄漏似乎並不合理嗎?這看起來像內存泄漏下的滴水盤。 – corsiKa 2011-12-15 22:43:30

+0

哪個JVM?什麼版本? GC調優參數/方法是每個JVM實現所專有的。 – 2011-12-15 22:50:30

回答

0

支持JVM堆並使用類似Terra Cotta's Big Memory的東西,它使用直接內存管理來擴展垃圾收集器的範圍。

0

如果您使用的是Sun/Oracle JVM,this頁面似乎是一個非常完整的GC調優入門指南。

1

您可以使用java.lang.management.MemoryUsage來確定已用內存和可用內存總量。當它接近可調諧GC收集閾值時,您可以拋出錯誤。

當然這樣做有點荒謬。如果問題是你需要更多的內存然後增加堆大小。更可能的問題是,當你完成它時,你不會優雅地釋放內存。