java.lang.OutOfMemoryError:超出GC开销限制
我在一个程序中得到这个错误,该程序创建了几个(数十万个)HashMap对象,每个对象都有几个(15-20)个文本项。 这些字符串在提交到数据库之前都已收集(没有分解成更小的数量)。
据Sun称,错误发生在“如果在垃圾收集中花费了太多时间:如果超过总时间的98%用于垃圾收集,并且小于2%的堆被恢复,则会抛出OutOfMemoryError。 ”。
显然,可以使用命令行将参数传递给JVM
第一种方法工作正常,第二种方法在另一个java.lang.OutOfMemoryError中结束,这次是关于堆。
所以,问题:对于这个特定的用例(即几个小型的HashMap对象),是否有任何程序化的替代方案? 例如,如果我使用HashMap clear()方法,问题就会消失,但存储在HashMap中的数据也会消失! :-)
StackOverflow中的相关主题也讨论了该问题。
你基本上没有足够的内存来顺利运行这个过程。 想到的选项:
-Xmx512m
类的东西 HashMap
对象进行处理 HashMap
之前使用它们的String.intern()
HashMap(int initialCapacity, float loadFactor)
构造函数调整您的情况 以下为我工作。 只需添加以下代码片段即可:
dexOptions {
javaMaxHeapSize "4g"
}
到你的build.gradle
:
android {
compileSdkVersion 23
buildToolsVersion '23.0.1'
defaultConfig {
applicationId "yourpackage"
minSdkVersion 14
targetSdkVersion 23
versionCode 1
versionName "1.0"
multiDexEnabled true
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
packagingOptions {
}
dexOptions {
javaMaxHeapSize "4g"
}
}
@takrl:这个选项的默认设置是:
java -XX:+UseConcMarkSweepGC
这意味着,此选项默认情况下不处于活动状态。 所以当你说你使用了“ +XX:UseConcMarkSweepGC
”选项时,我假设你使用的是这种语法:
java -XX:+UseConcMarkSweepGC
这意味着你明确地激活了这个选项。 有关Java HotSpot VM Options
@@本文档的正确语法和默认设置
上一篇: java.lang.OutOfMemoryError: GC overhead limit exceeded
下一篇: javac junit gives "error: package org.junit does not exist"