Jenkins服务器Maven测试任务内存升至20GB 内存泄漏问题根因咨询
Surefire插件内存不释放问题根本原因分析
- Surefire插件Fork策略配置错误
默认配置下surefire会复用同一个fork进程运行所有测试用例,5000个项目文件对应的测试类、实例对象会持续在同一个surefirebooter进程中堆积,且Java 13已经完全移除永久代,你配置的maxPermSize参数本身就不会生效。另外你在Maven主进程或者Jenkins任务行配置的Xmx参数仅作用于Maven主进程,不会传递给fork出来的surefirebooter子进程,所以内存限制配置完全不生效。
正确的子进程内存+fork策略配置示例如下:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.1.2</version> <configuration> <!-- 每运行一批测试用例就销毁旧fork进程,避免内存堆积 --> <forkCount>1</forkCount> <reuseForks>false</reuseForks> <!-- 单独配置surefire子进程的内存上限 --> <argLine>-Xmx2g -XX:MaxMetaspaceSize=512m</argLine> </configuration> </plugin>
- Selenium资源泄漏
Web自动化测试中每个用例启动的WebDriver实例、浏览器进程,如果没有在测试结束的生命周期方法(TestNG的@AfterMethod/@AfterClass)中显式调用quit()方法销毁,对应的驱动对象、页面缓存对象会持续驻留在surefirebooter进程的堆内存中,累计到一定量级就会触发内存溢出。 - 测试用例层面的内存泄漏
如果测试用例中存在静态集合类持续缓存测试数据、大对象(比如接口返回的报文、页面截图字节流)没有主动置空、测试上下文对象没有销毁的情况,这些对象会一直被GC Root引用,无法被垃圾回收,随着测试用例持续运行内存占用会线性上涨。 - 版本兼容性缺陷
你使用的Maven 3.6.0配套的默认Surefire插件版本对Java 13的模块化内存管理、Metaspace回收适配不完善,存在已知的堆外内存泄漏问题,旧版本插件的surefirebooter进程不会主动释放未使用的堆外内存,会导致内存占用持续走高。
内容的提问来源于stack exchange,提问作者Sam polo
相关产品推荐
相关产品推荐

