錯誤java.lang.OutOfMemoryError:超出了GC開銷限制

我執行JUnit測試時收到如下錯誤消息: html

java.lang.OutOfMemoryError: GC overhead limit exceeded

我知道什麼是OutOfMemoryError ,可是GC開銷限制是什麼意思? 我該如何解決? java


#1樓

該消息表示因爲某種緣由,垃圾收集器佔用了過多的時間(默認狀況下爲該進程全部CPU時間的98%),而且每次運行時恢復的內存不多(默認爲堆的2%)。 git

這實際上意味着您的程序中止任何進展,而且一直在忙於僅運行垃圾回收。 github

爲了防止您的應用程序浪費CPU時間而不作任何事情,JVM拋出此Error以便您有機會診斷問題。 算法

我見過這種狀況的罕見狀況是,某些代碼在一個已經很是受內存限制的環境中建立了大量的臨時對象和大量的弱引用對象。 oracle

請查看本文以瞭解詳細信息(特別是本部分 )。 eclipse


#2樓

當在垃圾回收上花費太多時間而返回的次數太少時,GC就會拋出此異常。 GC上花費了98%的CPU時間,而且不到2%的堆被恢復。 ide

此功能旨在防止應用程序長時間運行,而因爲堆過小而幾乎沒有進展,甚至沒有進展。 工具

您可使用命令行選項-XX:-UseGCOverheadLimit將其關閉-XX:-UseGCOverheadLimit 測試

更多信息在這裏

編輯:看起來有人能夠比我更快地輸入:)


#3樓

只需在如下位置設置此選項便可稍微增長堆大小

運行→運行配置→參數→VM參數

-Xms1024M -Xmx2048M

Xms-最小限制

Xmx-最大限制


#4樓

對我來講,如下步驟有效:

  1. 打開eclipse.ini文件
  2. 更改

    -Xms40m -Xmx512m

    -Xms512m -Xmx1024m
  3. 從新啓動Eclipse

看這裏


#5樓

錯誤緣由

超出了GC開銷限制」表示垃圾收集器一直在運行,而且Java程序的進度很是緩慢。

進行垃圾回收以後,若是Java進程花費了其大約98%以上的時間用於垃圾回收 ,而且正在恢復的內存少於2%,而且到目前爲止已經執行了最後5個(編譯時間常數)連續垃圾集合,而後引起java.lang.OutOfMemoryError

  1. 若是當前堆不夠,請增長堆大小
  2. 若是增長堆內存後仍然出現此錯誤,請使用內存分析工具,例如MAT (內存分析器工具), Visual VM等,並修復內存泄漏。
  3. 將JDK版本升級到最新版本(1.8.x)或至少1.7.x,並使用G1GC算法。 。 G1 GC的吞吐量目標是90%的應用時間和10%的垃圾收集時間
  4. 除了使用Xms1g -Xmx2g設置堆內存Xms1g -Xmx2g ,請嘗試

    -XX:+UseG1GC -XX:G1HeapRegionSize=n -XX:MaxGCPauseMillis=m -XX:ParallelGCThreads=n -XX:ConcGCThreads=n

看看有關G1GC的一些其餘相關問題

G1上的Java 7(JDK 7)垃圾收集和文檔

生產中的Java G1垃圾回收

Oracle TechNetwork關於GC微調的文章

相關文章
相關標籤/搜索