SBT 1.5.5 运行测试时使用-mem参数触发内存溢出报错问题
SBT版本升级后
-mem参数触发OOM异常的原因分析 - SBT 1.3+对
-mem参数的处理逻辑发生破坏性变更
SBT 1.2.8及更早版本中,-mem 4096参数仅限制SBT主进程的JVM堆内存大小,不会传递给fork模式运行的测试子进程。从1.3版本开始,启动脚本调整了参数处理逻辑,-mem指定的内存上限会同时作用于SBT主进程、以及所有fork启动的子JVM进程。1.5.5版本默认开启测试任务的fork模式,相当于主进程和测试子进程各自最高占用4G内存,总需求远超CircleCI单容器的内存配额,触发系统OOM Killer终止进程,返回killed提示和137退出码。 - 移除
-mem参数后运行正常的逻辑
不手动指定-mem参数时,SBT会自动识别当前运行环境的可用内存上限,为JVM分配合适的堆大小,主进程和测试子进程的总内存占用不会超过容器配额,因此不会触发OOM错误。 - 预装SBT 1.2.8镜像运行正常的原因
SBT的启动流程分为启动脚本层和核心层两部分:预装的1.2.8版本启动脚本运行时,即使项目中指定SBT版本为1.5.5,旧启动脚本依然会按1.2.8的逻辑处理-mem参数,仅给初始启动的JVM设置4G堆限制,不会将该参数透传给后续加载的1.5.5核心,也不会强制限制测试子进程的内存,总内存占用未超出阈值,因此任务可以正常执行。
内容的提问来源于stack exchange,提问作者user3238213
相关产品推荐
相关产品推荐

