SonarQube Scanner在Windows Docker容器运行报页文件过小错误排查
问题根因
- Windows Server 2019 容器的内存管理机制和Linux容器不同,页文件配额是容器启动时固定分配的,默认值仅为容器分配内存上限的12.5%,你给容器分配了5GB内存,默认页文件大小只有640MB左右,刚好低于你报错里需要分配的700MB,这是核心原因。
- 首次扫描可正常完成是因为JVM启动时只会预提交
-Xms指定的1GB内存中实际使用的部分,页文件配额足够支撑单次运行,但JVM退出后,Windows容器不会及时回收已占用的页文件提交额度,多次运行后额度完全占满,就会出现剩余物理内存足够但无法分配内存的问题。 - 你配置的
SONAR_SCANNER_OPTS的-Xmx4608m已经接近容器5GB的内存上限,JVM运行过程中除了堆内存还需要申请栈、元空间、直接内存等额外内存,进一步加剧了页文件配额的消耗。
修复方案
- 启动容器时显式指定页文件大小,添加运行参数
--storage-opt "size=120GB"同时添加--memory 8G --memory-swap 12G,将页文件配额提升到4GB以上,满足JVM最大堆+额外内存的提交需求。
注意:Windows Docker 20.10.7版本需要确保宿主机的C盘剩余空间足够存放容器的页文件,页文件会占用
--memory-swap减去--memory差值对应的磁盘空间。
- 调整JVM参数,降低最大堆内存设置,将
SONAR_SCANNER_OPTS改为-Xmx3G,避免JVM申请过量的提交内存占用页文件配额。 - 配置Azure DevOps Agent任务,每次执行完SonarQube扫描后清理容器残留的内存提交记录,或者直接设置为每次扫描任务启动新的容器实例,执行完成后直接销毁容器,从根本上避免页文件额度累积占用的问题。
- 如果使用的是进程隔离模式的容器,可以升级Docker版本到20.10.17以上,该版本修复了Windows容器页文件配额无法自动回收的已知BUG。
内容的提问来源于stack exchange,提问作者John Sharland
相关产品推荐
相关产品推荐

