2010-12-06 144 views
91

JVM用於拋出'java.lang.OutOfMemoryError:超出GC開銷限制'的採樣時間是什麼? 我知道你可以通過參數GCTimeLimit和GCHeapFreeLimit控制98%和2%,但最新的採樣時間是多少?超出GC開銷限制

回答

80

Java SE 6 HotSpot[tm] Virtual Machine Garbage Collection Tuning

以下

過多的GC時間和OutOfMemoryError異常

併發收集器將拋出一個OutOfMemoryError如果太多 的時間被消耗在垃圾收集上:如果超過98在垃圾回收中花費的總時間的百分比和回收的堆中不到2%,會拋出OutOfMemoryError。此功能 旨在防止應用程序在延長時間內運行一段時間,同時幾乎不進行任何操作,因爲堆太小而無法使用。如有必要,可以通過將 選件 -XX:-UseGCOverheadLimit添加到命令行來禁用此功能。

除了 花費在執行併發集合上的時間不計入98%時間限制之外,策略與並行收集器中的策略相同。換句話說,只有在 應用程序停止時執行的收集纔會計入過多的GC時間。這種集合通常是由於併發模式故障或顯式收集請求(例如,對System.gc()的調用)。

與通道進一步向下

一個明確的垃圾收集 與RMIS分佈式垃圾收集(DGC)發生的最常見的用途相結合。 使用RMI的應用程序引用其他虛擬機中的對象。 這些分佈式應用程序無法收集垃圾,因爲偶爾會收集本地堆,因此RMI會定期強制收集全部收集文件 。這些集合的頻率可以通過屬性來控制 。例如,

java -Dsun.rmi.dgc.client.gcInterval=3600000 

-Dsun.rmi.dgc.server.gcInterval=3600000每小時,而不是每一次微小 的違約率指定一次明確的集合。但是,這也可能導致一些對象花費更長的時間來回收 。如果 不需要DGC 活動的及時性的上限,則可以將這些屬性設置爲與Long.MAX_VALUE 一樣高,以使明確收集之間的時間實際上是無限的。

似乎意味着確定98%的評估週期是一分鐘長,但它可以在Sun的JVM上使用正確的定義進行配置。

當然,其他解釋也是可能的。

+5

RMI分佈式垃圾回收是與常規垃圾回收無關的活動。所以我不明白你如何推斷​​你剛剛做了什麼。 – 2010-12-06 22:50:36

相關問題