Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
错误java.lang.OutOfMemoryError:超出GC开销限制_Java_Garbage Collection_Out Of Memory_Heap Memory - Fatal编程技术网

错误java.lang.OutOfMemoryError:超出GC开销限制

错误java.lang.OutOfMemoryError:超出GC开销限制,java,garbage-collection,out-of-memory,heap-memory,Java,Garbage Collection,Out Of Memory,Heap Memory,我在执行JUnit测试时收到此错误消息: java.lang.OutOfMemoryError: GC overhead limit exceeded 我知道什么是OutOfMemoryError,但GC开销限制意味着什么?如何解决此问题?此消息意味着由于某种原因,垃圾收集器占用了过多的时间(默认情况下占进程所有CPU时间的98%),并且在每次运行中恢复的内存很少(默认情况下占堆的2%) 这实际上意味着您的程序停止执行任何进度,并且始终只忙于运行垃圾收集 为了防止应用程序在没有完成任何工作的情

我在执行JUnit测试时收到此错误消息:

java.lang.OutOfMemoryError: GC overhead limit exceeded

我知道什么是
OutOfMemoryError
,但GC开销限制意味着什么?如何解决此问题?

此消息意味着由于某种原因,垃圾收集器占用了过多的时间(默认情况下占进程所有CPU时间的98%),并且在每次运行中恢复的内存很少(默认情况下占堆的2%)

这实际上意味着您的程序停止执行任何进度,并且始终只忙于运行垃圾收集

为了防止应用程序在没有完成任何工作的情况下占用CPU时间,JVM抛出这个
错误
,以便您有机会诊断问题

我见过这种情况的罕见案例是,一些代码在已经非常内存受限的环境中创建了大量临时对象和大量弱引用对象

查看Java GC调优指南,该指南可用于各种Java版本,并包含有关此特定问题的部分:

  • 为不同的垃圾收集器提供了关于过量GC的专用部分:
    • 为了
    • 为了
    • 没有提到垃圾优先(G1)收集器的这种特定错误情况
  • 及其
  • 和它的

引用Oracle的文章:

GC时间过长和OutOfMemory错误

如果在垃圾收集中花费的时间太多,并行收集器将抛出OutOfMemoryError:如果在垃圾收集中花费的时间超过总时间的98%,而堆的恢复时间少于2%,则将抛出OutOfMemoryError。此功能旨在防止应用程序在运行较长时间的同时由于堆太小而进展甚微或毫无进展。如有必要,可通过在命令行中添加选项
-XX:-usegcoveredlimit
来禁用此功能


编辑:看起来有人打字比我快:)

通常是代码。下面是一个简单的例子:

import java.util.*;

public class GarbageCollector {

    public static void main(String... args) {

        System.out.printf("Testing...%n");
        List<Double> list = new ArrayList<Double>();
        for (int outer = 0; outer < 10000; outer++) {

            // list = new ArrayList<Double>(10000); // BAD
            // list = new ArrayList<Double>(); // WORSE
            list.clear(); // BETTER

            for (int inner = 0; inner < 10000; inner++) {
                list.add(Math.random());
            }

            if (outer % 1000 == 0) {
                System.out.printf("Outer loop at %d%n", outer);
            }

        }
        System.out.printf("Done.%n");
    }
}
然后查看
gc.log

  • 使用坏方法触发444次
  • 使用更差的方法触发666次
  • 使用更好的方法触发354次

现在可以肯定的是,这不是最好的测试或最好的设计,但是当您面临除了实现这样一个循环之外别无选择的情况时,或者在处理表现糟糕的现有代码时,选择重用对象而不是创建新对象可以减少垃圾收集器妨碍的次数…

如果您确定程序中没有对象,请尝试:

  • 增加堆大小,例如
    -Xmx1g
  • 启用并发低暂停收集器
    -XX:+UseConMarkSweepGC
  • 尽可能重用现有对象以节省一些内存

  • 如有必要,可以通过在命令行中添加选项
    -XX:-usegcoveredlimit
    来禁用堆大小。

    只需在

    跑→ 运行配置→ 论据→ VM参数

    -Xms1024M-Xmx2048M
    
    Xms-最低限度


    Xmx-对于我的最大限制,以下步骤有效:

  • 打开
    eclipse.ini
    文件
  • 改变

    -Xms40m
    -Xmx512m
    

    -Xms512m
    -Xmx1024m
    
  • 重新启动Eclipse


  • 根据以下内容确定错误原因:(添加了强调和换行符)

    […]“超出了GC开销限制”表示垃圾收集器一直在运行,Java程序进展非常缓慢

    在垃圾收集之后,如果Java进程花费大约98%的时间进行垃圾收集,并且恢复的堆不到2%,并且一直在进行最后5次(编译时常量)连续垃圾收集,则会抛出
    Java.lang.OutOfMemoryError
    。[……]

  • 如果当前堆不足,请增加堆大小
  • 如果在增加堆内存后仍然出现此错误,请使用内存分析工具(内存分析器工具)等,并修复内存泄漏
  • 将JDK版本升级到最新版本(1.8.x)或至少1.7.x,并使用G1GC算法。G1 GC的吞吐量目标是90%的应用程序时间和10%的垃圾收集时间
  • 除了使用-
    Xms1g-Xmx2g
    设置堆内存外,还可以尝试

    -XX:+UseG1GC -XX:G1HeapRegionSize=n -XX:MaxGCPauseMillis=m  
    -XX:ParallelGCThreads=n -XX:ConcGCThreads=n
    
  • 请看一些有关G1GC的相关问题


    您需要增加Jdeveloper中的内存大小,请转到setdomainev.cmd

    set WLS_HOME=%WL_HOME%\server    
    set XMS_SUN_64BIT=**256**
    set XMS_SUN_32BIT=**256**
    set XMX_SUN_64BIT=**3072**
    set XMX_SUN_32BIT=**3072**
    set XMS_JROCKIT_64BIT=**256**
    set XMS_JROCKIT_32BIT=**256**
    set XMX_JROCKIT_64BIT=**1024**
    set XMX_JROCKIT_32BIT=**1024**
    
    if "%JAVA_VENDOR%"=="Sun" (
        set WLS_MEM_ARGS_64BIT=**-Xms256m -Xmx512m**
        set WLS_MEM_ARGS_32BIT=**-Xms256m -Xmx512m**
    ) else (
        set WLS_MEM_ARGS_64BIT=**-Xms512m -Xmx512m**
        set WLS_MEM_ARGS_32BIT=**-Xms512m -Xmx512m**
    )
    

    试试这个

    打开
    build.gradle
    文件

      android {
            dexOptions {
               javaMaxHeapSize = "4g"
            }
       }
    

    以下几点对我有用。只需添加以下代码段:

    android {
            compileSdkVersion 25
            buildToolsVersion '25.0.1'
    
    defaultConfig {
            applicationId "yourpackage"
            minSdkVersion 10
            targetSdkVersion 25
            versionCode 1
            versionName "1.0"
            multiDexEnabled true
        }
    dexOptions {
            javaMaxHeapSize "4g"
        }
    }
    

    在build.gradle(模块:app)文件中增加javaMaxHeapsize

    至(在渐变中添加此行)


    在Netbeans中,设计最大堆大小可能会有所帮助。转到运行=>设置项目配置=>自定义。在弹出窗口的运行中,转到VM选项,填写
    -Xms2048m-Xmx2048m
    。它可以解决堆大小问题。

    我在Android Studio工作,在尝试生成用于发布的签名APK时遇到此错误。 我能够毫无问题地构建和测试调试APK,但只要我想构建发布APK,构建过程就会连续运行几分钟,最后以“Error java.lang.OutOfMemoryError:超出GC开销限制”结束。我增加了VM和Android DEX编译器的堆大小,但问题仍然存在。 最后,经过几个小时和几杯咖啡之后,我发现问题出在我的应用程序级别的“build.gradle”文件中——我有“minifyEnabled”参数
      android {
            dexOptions {
               javaMaxHeapSize = "4g"
            }
       }
    
    android {
            compileSdkVersion 25
            buildToolsVersion '25.0.1'
    
    defaultConfig {
            applicationId "yourpackage"
            minSdkVersion 10
            targetSdkVersion 25
            versionCode 1
            versionName "1.0"
            multiDexEnabled true
        }
    dexOptions {
            javaMaxHeapSize "4g"
        }
    }
    
    dexOptions {
        javaMaxHeapSize "1g"
    }
    
     dexOptions {
            javaMaxHeapSize "4g"
        }
    
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.sign_config_release
        }
        debug {
            debuggable true
            signingConfig signingConfigs.sign_config_debug
        }
    }
    
    //...
    
        //...
    
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.sign_config_release
        }
        debug {
            debuggable true
            signingConfig signingConfigs.sign_config_debug
        }
    }
    
    //...
    
    idea64.exe.vmoptions
    
    -Xms512m
    -Xmx2024m
    -XX:MaxPermSize=700m
    -XX:ReservedCodeCacheSize=480m
    
    -Xms size in bytes
    
    Example : java -Xms32m
    
    -Xmn size in bytes
    
    Example : java -Xmx2m
    
    -Xmx size in bytes
    
    Example : java -Xmx2048m