2015-02-24 52 views
0

我的應用程序拋出java.lang.OutOfMemoryError: GC overhead limit exceeded錯誤。我搜索了它並獲得了足夠的信息。 Oracle說:gc堆分配率和我的java程序的速度

原因:詳細消息「超出GC開銷限制」表示垃圾收集器一直在運行,Java程序進度非常緩慢。在垃圾收集之後,如果Java進程花費了大約98%的時間進行垃圾收集,並且如果它正在恢復小於2%的堆,並且迄今爲止最後5次(編譯時間常量)連續垃圾集合,則拋出java.lang.OutOfMemoryError。通常會拋出此異常,因爲實時數據量很少適合Java堆,而新分配的可用空間很小。 操作:增加堆大小。可以使用命令行標誌-XX:-UseGCOverheadLimit關閉超出GC開銷限制的java.lang.OutOfMemoryError異常。

我的問題是;我如何跟蹤由GC和我的java程序分配的堆。我試過jstat -gcutil但它沒有足夠的信息。有沒有一個工具,我可以看到我的java程序堆堆分配GC堆分配之間的比率? 謝謝你的建議。

+1

jconsole或商業輪廓儀例如jprofiler – 2015-02-24 10:17:38

回答

2

請注意,它不是「java堆」vs「gc堆分配」,而是專用於實際程序的CPU時間與專用於GC的CPU時間。大部分時間都花在垃圾回收器上時拋出異常。

當分配的堆接近其最大大小(選項-Xmx)並且堆中的大部分對象是reachable時,會發生這種情況。您的工作是查找最大大小是否太小(可能是使用默認值),或者存在內存泄漏(阻止收集大型樹的對象)。

在處理這些問題時,我更喜歡使用隨Oracle JDK提供的jvisualvm並提供實時圖形信息。

最新的JVM提供了比以前更詳細的信息,但它們也使用不同的GC算法,這可能會改變觀察結果。

+0

我應該使用結果集爲我的數據庫操作?我有700萬條記錄選擇和插入。我已經使用8個線程。 – mft 2015-02-24 12:08:26

+0

當我使用visualvm進行跟蹤時,堆大小分配開始時最大大約爲486 mb。我的程序仍在工作,堆大小現在約爲516 MB。它不會增加我的事情。它正在縮小。對此有何評論?這將有所幫助 – mft 2015-02-24 12:14:50