Mne*_*nth 766 java garbage-collection heap-memory out-of-memory
我在执行JUnit测试时收到此错误消息:
java.lang.OutOfMemoryError: GC overhead limit exceeded
Run Code Online (Sandbox Code Playgroud)
我知道它OutOfMemoryError是什么,但GC开销限制意味着什么?我怎么解决这个问题?
Joa*_*uer 732
此消息表示由于某种原因,垃圾收集器花费了过多的时间(默认情况下为进程的所有CPU时间的98%),并且在每次运行中恢复的内存非常少(默认情况下为堆的2%).
这实际上意味着您的程序停止执行任何进度,并且忙于始终只运行垃圾回收.
为了防止您的应用程序在没有完成任何操作的情况下吸收CPU时间,JVM会抛出这个,Error以便您有机会诊断问题.
在我看到这种情况的罕见情况下,一些代码在已经非常受内存限制的环境中创建了大量临时对象和大量弱引用对象.
dav*_*ave 205
当垃圾收集花费太多时间以获得太少的回报时,GC会抛出此异常,例如.在GC上花费了98%的CPU时间,并且恢复了不到2%的堆.
此功能旨在防止应用程序长时间运行,同时由于堆太小而很少或没有进度.
您可以使用命令行选项将其关闭
-XX:-UseGCOverheadLimit
更多信息在这里
编辑:看起来有人可以比我更快打字:)
Mik*_*ike 44
通常是代码.这是一个简单的例子:
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");
}
}
Run Code Online (Sandbox Code Playgroud)
使用java 1.6.0_24-b07在Windows7 32位上.
java -Xloggc:gc.log GarbageCollector
然后看看gc.log
现在被授予,这不是最好的测试或最好的设计,但是当遇到除了实现这样的循环或者处理行为不好的现有代码时别无选择的情况时,选择重用对象而不是创建新对象可以减少垃圾收集器挡住的次数......
Rav*_*abu 33
导致错误的原因
超出GC开销限制"表示垃圾收集器一直在运行,Java程序进展非常缓慢.
在垃圾收集之后,如果Java进程花费超过大约98%的时间进行垃圾收集,并且它正在恢复少于2%的堆并且到目前为止已经执行了最后5个(编译时常量)连续垃圾集合,然后抛出java.lang.OutOfMemoryError
除了用 - 设置堆内存外Xms1g -Xmx2g,请尝试
-XX:+UseG1GC -XX:G1HeapRegionSize=n -XX:MaxGCPauseMillis=m
-XX:ParallelGCThreads=n -XX:ConcGCThreads=n
Run Code Online (Sandbox Code Playgroud)看看有关G1GC的一些更相关的问题
cho*_*pss 29
只需在此处设置此选项,即可稍微增加堆大小
运行→运行配置→参数→VM参数
-Xms1024M -Xmx2048M
Run Code Online (Sandbox Code Playgroud)
Xms - 最低限度
Xmx - 最大限制
Sun*_*hoo 16
对我来说,以下步骤有效:
eclipse.ini文件更改
-Xms40m
-Xmx512m
Run Code Online (Sandbox Code Playgroud)
至
-Xms512m
-Xmx1024m
Run Code Online (Sandbox Code Playgroud)重启Eclipse
ali*_*ara 12
试试这个
打开build.gradle文件
android {
dexOptions {
javaMaxHeapSize = "4g"
}
}
Run Code Online (Sandbox Code Playgroud)
小智 12
以下对我有用.只需添加以下代码段:
android {
compileSdkVersion 25
buildToolsVersion '25.0.1'
defaultConfig {
applicationId "yourpackage"
minSdkVersion 10
targetSdkVersion 25
versionCode 1
versionName "1.0"
multiDexEnabled true
}
dexOptions {
javaMaxHeapSize "4g"
}
}
Run Code Online (Sandbox Code Playgroud)
在build.gradle(Module:app)文件中增加javaMaxHeapsize
dexOptions {
javaMaxHeapSize "1g"
}
Run Code Online (Sandbox Code Playgroud)
到(在gradle中添加此行)
dexOptions {
javaMaxHeapSize "4g"
}
Run Code Online (Sandbox Code Playgroud)
您还可以通过将其添加到您的gradle.properties文件来增加内存分配和堆大小:
org.gradle.jvmargs=-Xmx2048M -XX\:MaxHeapSize\=32g
不一定要2048M和32g,想多大就多大。
Java 堆大小描述(xms、xmx、xmn)
\n\n-Xms size in bytes\n\nExample : java -Xms32m\nRun Code Online (Sandbox Code Playgroud)\n\n设置 Java 堆的初始大小。\n默认大小为 2097152 (2MB)。\n这些值必须是 1024 字节 (1KB) 的倍数且大于 1024 字节 (1KB)。\n(-server 标志将默认大小增加到 32M。)
\n\n-Xmn size in bytes\n\nExample : java -Xmx2m\nRun Code Online (Sandbox Code Playgroud)\n\n设置 Eden 生成的初始 Java 堆大小。\n默认值为 640K。\n(-server 标志将默认大小增加到 2M。)
\n\n-Xmx size in bytes\n\nExample : java -Xmx2048m\nRun Code Online (Sandbox Code Playgroud)\n\n设置 Java 堆可以增长到的最大大小。\n默认大小为64M。\n(-server 标志将默认大小增加到 128M。)\n最大堆限制约为 2 GB (2048MB)。
\n\nJava 内存参数(xms、xmx、xmn)格式
\n\n设置 Java 堆大小时,应使用字母 \xe2\x80\x9cm\xe2\x80\x9d 或 \xe2\x80\x9cM\xe2\x80\x9d(MB)之一或 \xe2\ 来指定内存参数。 GB 为 x80\x9cg\xe2\x80\x9d 或 \xe2\x80\x9cG\xe2\x80\x9d。如果您指定 \xe2\x80\x9cMB\xe2\x80\x9d 或 \xe2\x80\x9cGB,您的设置将\xe2\x80\x99t 不起作用。\xe2\x80\x9d 有效参数如下所示:
\n\n-Xms64m 或 -Xms64M\n-Xmx1g 或 -Xmx1G\n还可以使用 2048MB 来指定 2GB\n此外,请确保在指定参数时仅使用整数。使用 -Xmx512m 是一个有效选项,但 -Xmx0.5g 会导致错误。
\n\n此参考可能对某人有帮助。
\n| 归档时间: |
|
| 查看次数: |
854477 次 |
| 最近记录: |