Apple M1芯片Docker中用OpenJDK8执行sbt compile出现SIGSEGV错误如何解决?
问题核心原因
Apple M1属于arm64架构,你强制容器运行linux/amd64架构的镜像时,Docker底层依赖QEMU对x86指令做动态转译,OpenJDK 8的C2即时编译器在该转译环境下存在已知兼容缺陷,编译Scala代码时触发段错误导致崩溃。
解决方案
方案1:禁用C2即时编译器(改造成本最低)
在sbt执行参数中添加-XX:TieredStopAtLevel=1,禁用C2编译器仅保留轻量的C1编译器,可直接避开转译兼容问题,完整执行命令如下:
sbt -XX:TieredStopAtLevel=1 -Dsbt.ivy.home='.ivy2' -Dsbt.global.base='.sbt' -Dsbt.repository.config='.sbt/repositories' compile
如果需要永久生效,可在项目根目录新建/编辑.jvmopts文件,添加一行-XX:TieredStopAtLevel=1即可。
方案2:切换为arm64原生镜像(性能最优)
直接使用适配arm64架构的基础镜像,从根源避免QEMU转译:
- 修改Dockerfile的基础镜像为arm64兼容的OpenJDK 8版本:
FROM --platform=$BUILDPLATFORM eclipse-temurin:8-jdk-jammy - 删除docker-compose.yml中
platform: linux/x86_64配置 - 重新构建容器后再执行编译即可,sbt 0.13.15原生支持arm64架构,无兼容问题。
方案3:升级Docker Desktop
如果上述方案不适用,将Docker Desktop升级到最新正式版,新版本内置的QEMU转译层修复了大量JVM相关的兼容缺陷,升级后重试编译即可。
内容的提问来源于stack exchange,提问作者jiamae
相关产品推荐
相关产品推荐

