我執行JUnit測試時收到如下錯誤消息: html
java.lang.OutOfMemoryError: GC overhead limit exceeded
我知道什麼是OutOfMemoryError
,可是GC開銷限制是什麼意思? 我該如何解決? java
該消息表示因爲某種緣由,垃圾收集器佔用了過多的時間(默認狀況下爲該進程全部CPU時間的98%),而且每次運行時恢復的內存不多(默認爲堆的2%)。 git
這實際上意味着您的程序中止任何進展,而且一直在忙於僅運行垃圾回收。 github
爲了防止您的應用程序浪費CPU時間而不作任何事情,JVM拋出此Error
以便您有機會診斷問題。 算法
我見過這種狀況的罕見狀況是,某些代碼在一個已經很是受內存限制的環境中建立了大量的臨時對象和大量的弱引用對象。 oracle
請查看本文以瞭解詳細信息(特別是本部分 )。 eclipse
當在垃圾回收上花費太多時間而返回的次數太少時,GC就會拋出此異常。 GC上花費了98%的CPU時間,而且不到2%的堆被恢復。 ide
此功能旨在防止應用程序長時間運行,而因爲堆過小而幾乎沒有進展,甚至沒有進展。 工具
您可使用命令行選項-XX:-UseGCOverheadLimit
將其關閉-XX:-UseGCOverheadLimit
測試
更多信息在這裏
編輯:看起來有人能夠比我更快地輸入:)
只需在如下位置設置此選項便可稍微增長堆大小
運行→運行配置→參數→VM參數
-Xms1024M -Xmx2048M
Xms-最小限制
Xmx-最大限制
對我來講,如下步驟有效:
eclipse.ini
文件 更改
-Xms40m -Xmx512m
至
-Xms512m -Xmx1024m
從新啓動Eclipse
錯誤緣由
超出了GC開銷限制」表示垃圾收集器一直在運行,而且Java程序的進度很是緩慢。
進行垃圾回收以後,若是Java進程花費了其大約98%以上的時間用於垃圾回收 ,而且正在恢復的內存少於2%,而且到目前爲止已經執行了最後5個(編譯時間常數)連續垃圾集合,而後引起java.lang.OutOfMemoryError
除了使用Xms1g -Xmx2g
設置堆內存Xms1g -Xmx2g
,請嘗試
-XX:+UseG1GC -XX:G1HeapRegionSize=n -XX:MaxGCPauseMillis=m -XX:ParallelGCThreads=n -XX:ConcGCThreads=n
看看有關G1GC的一些其餘相關問題