【发布时间】:2022-06-12 18:01:26
【问题描述】:
Java 程序运行良好,但测试失败并显示以下消息:
Caused by: java.lang.OutOfMemoryError: Java heap space
at java.base/java.util.BitSet.initWords(BitSet.java:167)
at java.base/java.util.BitSet.<init>(BitSet.java:162)
at lv.id.jc.ipv4.IntSet.<init>(IntSet.java:6)
at lv.id.jc.ipv4.IntSetTest.$spock_initializeFields(IntSetTest.groovy:11)
我已经将GROOVY_OPTS 设置为-Xmx1g,但它没有帮助。
我使用测试框架Spock 2.0,被测java代码是
public class IntSet {
private final BitSet[] storage = {new BitSet(Integer.MAX_VALUE), new BitSet(Integer.MAX_VALUE)};
public void add(int i) {
if (i >= 0) {
storage[0].set(i);
} else {
storage[1].set(-++i);
}
}
public long size() {
return (long) storage[0].cardinality() + storage[1].cardinality();
}
}
我在 Spock Framework 文档中找不到如何解决此类问题。我使用 IntelliJ 和 gradle。
如有任何想法,我将不胜感激。
添加信息。我在 gradlew 文件中设置属性:
DEFAULT_JVM_OPTS='"-Xmx2048m" "-Xms128m"'
我使用这个命令运行程序:
./gradlew run -q --console=plain --args="ip_addresses"
它工作正常并打印正确的结果。但是,当我使用命令运行测试时:
./gradlew test
然后我收到一条错误消息:
> Task :test FAILED
FAILURE: Build failed with an exception.
HTML 报告显示:
org.gradle.internal.exceptions.DefaultMultiCauseException: Multiple Failures (2 failures)
java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space
【问题讨论】:
-
Spock 与内存限制无关,这完全取决于执行代码的 JVM。您如何运行测试(Maven/Gradle/其他)?
-
我使用 gradle 和 IntelliJ。我从 InteliiJ 和使用 gradlew 测试的命令提示符运行测试。你给了我一个检查gradle设置的想法。谢谢!
-
您正在创建两个大小为 2,147,483,647 (
Integer.MAX_VALUE) 位的位集,例如每个约 256 MB。可能这是您的问题,而不是与 Spock 相关的任何问题。他们真的必须那么大吗?在您的 IDEA 测试运行配置中,您可以指定任何您希望的 VM 参数,因此您也有机会增加堆大小。 -
任务是在 ddd.ddd.ddd.ddd 格式的文本文件中的 8,000,000,000 个地址中计算唯一的 IPv4 地址。所以我将它们转换为 int 表示并创建一个容器。第二个矿井实现(性能更高)使用 long[] storage = new long[1
-
“计算唯一的 IPv4 地址”是什么意思?为测试目的计算随机地址?如果它们需要是唯一的,为什么要使用数组而不是集合呢?当然,你可以计算唯一的,而不用随机化它们,每次只增加 1,那么你就不需要集合了。
标签: unit-testing heap-memory spock bitset