由于堆内存已满,jUnits 花费的时间太长

Posted

技术标签:

【中文标题】由于堆内存已满,jUnits 花费的时间太长【英文标题】:jUnits taking too long due to heap memory getting full 【发布时间】:2019-05-23 04:16:01 【问题描述】:

对于我正在进行的一个项目,我们编写了从文本文件读取请求然后调用方法的 jUnit。在实际的方法中,我们正在创建 PDF 报告,因此会创建表格、文档等对象,因此可用于 jUnit 的堆内存很快就会耗尽,并且 jUnit 需要花费大量时间才能完成。

有什么方法可以确保一旦执行 jUnit,为它创建的所有对象都会从内存中收集垃圾?

我尝试在每个 Test 类的 @AfterClass 方法中使用 System.gc() 方法,但没有帮助。此外,尝试通过增加堆大小但结果相同。 使用的框架是Spring-boot 1.4.0JUnit 版本是4.12

【问题讨论】:

【参考方案1】:

System.gc() 不保证垃圾收集器会运行。

来自 JUnit 文档

按照设计,测试实例树在一次通过中构建,然后测试在第二次通过中执行。测试运行器在测试执行期间持有对所有测试实例的强引用。这意味着对于包含许多 Test 实例的非常长的测试运行,在整个测试运行结束之前可能不会对任何测试进行垃圾收集。

因此,如果您在测试中分配外部或有限资源,则您有责任释放这些资源。例如,在 tearDown() 方法中将对象显式设置为 null,可以在整个测试运行结束之前对其进行垃圾回收。

简而言之。完成后确保将对象引用设置为 null

【讨论】:

以上是关于由于堆内存已满,jUnits 花费的时间太长的主要内容,如果未能解决你的问题,请参考以下文章

JVM内存管理概述

由于堆大小增加,android中的内存不足错误

“来自调试器的消息:由于内存问题而终止”的任何通知或观察者?

上传图像数据集后,Google colab 内存已满

内存溢出与内存泄漏

Android 堆内存增加