当前位置: 首页 > 知识库问答 >
问题:

Spring集成测试占用大量内存,在GradleWorkerMain中使用大量重复线程

华懿轩
2023-03-14

我有一个有点复杂的Spring Boot应用程序,有大量的测试。

运行测试时,它似乎积累了很多线程,其中一个线程有多个实例,称为SimplePauseDetectorThread\u 0,我将其追溯到这个依赖项

|    |    |    \--- io.micrometer:micrometer-core:1.1.1
|    |    |         +--- org.latencyutils:LatencyUtils:2.0.3

这似乎发生在Spring Boot 2.0.6和2.1.1上。

典型测试可能如下所示:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK)
@ActiveProfiles(profiles = {"test"})
public class MyTest {
[...]

我的执行器配置如下所示:

management.endpoints.enabled-by-default=false
management.endpoint.prometheus.enabled=true
management.endpoints.web.base-path=/
management.endpoints.web.exposure.include=prometheus
management.endpoints.web.path-mapping.prometheus=prometheus
spring.metrics.prometheus.enabled=true

见附件截图

共有1个答案

楚建柏
2023-03-14

Pivotal的Snicoll在GitHub上帮助了我,他建议它可能与Spring引导测试框架中的上下文缓存有关。

如果您有大量使用Spring集成的考试数量和一些重要的上下文配置(您只显示了一个类),那么每个配置将创建一个上下文,我可以看到线程数量在该场景中增加。

然后,他向我指出了相关文件,其中指出:

通过设置名为spring的JVM系统属性,可以从命令行或构建脚本配置最大大小。测验上下文隐藏物最大尺寸。或者,您可以使用SpringProperties API以编程方式设置相同的属性。

org。springframework。果心SpringProperties状态:

Reads a {@code spring.properties} file from the root of the Spring library classpath

这就为我们提供了两种设置maxSize方法

向gradletest任务添加属性,该任务将在生成中配置GradleWorkerMain。格雷德尔

test {
    jvmArgs "-Dspring.test.context.cache.maxSize=1"
}

如果有多个子项目,则可能需要使用此选项。

有关将设置应用于所有子项目的方法,请参见下面的奖励。

您可以在my-service/src/test/Resources/spring.properties中编写设置,如下所示:

spring.test.context.cache.maxSize=1

现在,我的测试运行得很好,内存消耗更少,线程也更少。

这也解决了Gradle 5默认拥有512MB最大堆(而不是25%的系统RAM)的工作线程的问题-如果我没有在javatest的configuration中添加具有更大堆的自定义JVMARG,子项目测试套件将不再耗尽所有可用RAM,这将导致工作线程OOM项目。我现在可以在gradle worker中使用“香草”堆大小运行。

如果您确实想调整Gradle测试可用的RAM,请在rootbuild中执行类似的操作。格雷德尔

allprojects { project ->
    project.plugins.withId('java') {
        test {
            maxHeapSize = "1536M"
            // If you don't want to use spring.properties (or add other JVM args)
            jvmArgs "-Dspring.test.context.cache.maxSize=1"
        }
    }
    project.plugins.withId('java-library') {
        test {
            maxHeapSize = "1536M"
            // If you don't want to use spring.properties (or add other JVM args)
            jvmArgs "-Dspring.test.context.cache.maxSize=1"
        }
    }
}

 类似资料:
  • 问题内容: 我是所有内存管理主题的新手,所以有很多我不了解的事情。 我正在尝试将图像缓存在我的应用程序中,但是我在内存消耗方面遇到了麻烦: 所有的Bitmap Chaching代码都可以从此处复制粘贴:http : //developer.android.com/training/displaying- bitmaps/index.html 我调试了代码,并在Eclipse的DDMS视图中检查了堆

  • 问题内容: 我正在尝试创建一个文件下载程序作为后台服务,但是当计划了一个大文件时,首先将其放入内存中,然后在下载结束时将文件写入磁盘。 考虑到我可能同时下载许多文件,如何使文件逐渐写入磁盘保留内存? 这是我使用的代码: 问题答案: 我将回调更改为: 这工作得很好。

  • 问题内容: 我的磁盘上只有168MB的文件。这只是一个逗号分隔的单词,id的列表。该单词的长度可以为1-5个字符。有650万行。 我在python中创建了一个字典,将其加载到内存中,因此我可以针对该单词列表搜索传入的文本。当python将其加载到内存中时,它显示已使用的1.3 GB RAM空间。知道为什么吗? 假设我的word文件如下所示… 然后再加上650万。然后,我遍历该文件并创建一个字典(p

  • 我正在制作一个应用程序,它在一个UImageView中显示gif,从Parse加载gif。我遇到的问题是,每当我加载一个Gif时,它都会使用大约20 mb的内存,而当我执行segue时,这个内存没有被分配。我从UImageView中删除了图像本身,但它仍然没有释放内存。 这是我用来显示GIF的代码: 这可能是我记忆问题的原因吗?感谢任何帮助!

  • 问题内容: 我有一小段代码每隔五分钟拍摄一次我的桌面的屏幕截图。但是,我对它占用的内存量有些困惑-通常它会爬升到200mb RAM,我敢肯定这是多余的…谁能告诉我a)减少内存占用空间的明智方法或b)它为什么涨 可言 ? 问题答案: 其他答案是正确的:Java将使用允许的尽可能多的内存,这时它将进行垃圾回收。要解决此问题,可以在JVM设置中指定较小的最大堆大小。您可以使用- Xmx设置来执行此操作。

  • Top显示tomcat使用少量常驻内存但大量虚拟内存,有没有办法给它更多常驻内存?我已经尝试用-Xmx2gJAVA_OPTS,但常驻内存仍然浮动在250毫克左右