You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

低资源AWS CodeBuild实例构建Spring Native镜像失败求助

问题

通过AWS CodePipeline调用AWS CodeBuild构建GraalVM Spring Native项目的Boot镜像时,频繁因内存不足中断。具体环境与问题细节如下:

  • 使用实例规格:Linux Small(BUILD_GENERAL1_SMALL,3GB内存、2vCPU、64GB磁盘),也曾尝试BUILD_GENERAL1_MEDIUM实例,仍失败
  • 环境镜像:aws/codebuild/standard:6.0
  • 本地MacBook M1 Pro构建时约占用5.5GB内存
  • 已尝试构建器:默认Spring构建器、paketobuildpacks/builder:tiny

错误日志片段

内存分配失败(exit status 1)

> Task :infrastructure:bootBuildImage
Building image 'docker.io/library/experiences-service:latest'
    [creator]     [1/7] Initializing...                                           (12.1s @ 0.56GB)
    [creator]      Version info: 'GraalVM 22.3.0 Java 17 CE'
    [creator]      Java version info: '17.0.5+8-LTS'
    [creator]      C compiler: gcc (linux, x86_64, 7.5.0)
    [creator]      Garbage collector: Serial GC
    [creator]      1 user-specific feature(s)
    [creator]      - org.springframework.aot.nativex.feature.PreComputeFieldFeature
    [creator]     The bundle named: i18n.Parsing, has not been found. If the bundle is part of a module, verify the bundle name is a fully qualified class name. Otherwise verify the bundle path is accessible in the classpath.
    [creator]     The bundle named: i18n.Scalars, has not been found. If the bundle is part of a module, verify the bundle name is a fully qualified class name. Otherwise verify the bundle path is accessible in the classpath.
    [creator]     [2/7] Performing analysis...  [**********]                     (114.5s @ 2.31GB)
    [creator]       28,561 (93.30%) of 30,612 classes reachable
    [creator]       44,044 (68.12%) of 64,654 fields reachable
    [creator]      130,512 (64.11%) of 203,567 methods reachable
    [creator]        1,232 classes,   473 fields, and 5,577 methods registered for reflection
    [creator]           82 classes,    76 fields, and    64 methods registered for JNI access
    [creator]            4 native libraries: dl, pthread, rt, z
    [creator]     OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000006b5380000, 1065353216, 0) failed; error='Not enough space' (errno=12)
    [creator]     #
    [creator]     # There is insufficient memory for the Java Runtime Environment to continue.
    [creator]     # Native memory allocation (mmap) failed to map 1065353216 bytes for committing reserved memory.
    [creator]     # An error report file with more information is saved as:
    [creator]     # /layers/paketo-buildpacks_native-image/native-image/hs_err_pid178.log
    [creator]     Error: Image build request failed with exit status 1
    [creator]     unable to invoke layer creator
    [creator]     unable to contribute native-image layer

OOM终止(exit status 137)

[creator]     [2/7] Performing analysis...  [**********]                     (122.4s @ 3.24GB)
    [creator]       28,561 (93.30%) of 30,612 classes reachable
    [creator]       44,044 (68.12%) of 64,654 fields reachable
    [creator]      130,512 (64.11%) of 203,565 methods reachable
    [creator]        1,232 classes,   473 fields, and 5,577 methods registered for reflection
    [creator]           82 classes,    76 fields, and    64 methods registered for JNI access
    [creator]            4 native libraries: dl, pthread, rt, z
    [creator]     Error: Image build request failed with exit status 137

已尝试的优化

  • 在gradle.properties中设置:
    org.gradle.jvmargs=-Xmx512m
    
  • 为BootBuildImage Gradle任务配置环境变量(日志显示已应用但无效果):
    tasks.withType<org.springframework.boot.gradle.tasks.bundling.BootBuildImage> {
        if (org.apache.tools.ant.taskdefs.condition.Os.isArch("aarch64")) {
            builder.set("dashaun/java-native-builder-arm64:latest")
        } else {
            builder.set("paketobuildpacks/builder:tiny")
        }
        environment.set(
            mapOf(
                "JAVA_TOOL_OPTIONS" to "-Xmx512m",
                "BPL_JVM_THREAD_COUNT" to "50",
                "BP_NATIVE_IMAGE" to "true",
                "BP_JVM_VERSION" to "17",
                "BP_NATIVE_IMAGE_BUILD_ARGUMENTS" to "--initialize-at-run-time=io.netty.handler.ssl.BouncyCastleAlpnSslUtils"
            )
        )
        imageName.set(rootProject.name)
    }
    

希望了解可传递给Docker环境或Paketo Buildpacks的参数,以限制构建过程中的资源占用。


解决方案

1. Paketo Buildpacks专属内存控制参数

直接针对GraalVM构建过程配置资源限制,添加以下环境变量到BootBuildImage任务中:

  • BP_NATIVE_IMAGE_JVM_ARGS:设置GraalVM构建时的JVM堆内存与元空间上限,匹配CodeBuild实例的内存规格:
    "BP_NATIVE_IMAGE_JVM_ARGS" to "-Xmx2g -XX:MaxMetaspaceSize=512m"
    
  • BP_NATIVE_IMAGE_BUILD_ARGUMENTS:添加GraalVM Native Image的内存优化参数,限制堆大小与并发线程数(线程数建议匹配实例vCPU数量):
    "BP_NATIVE_IMAGE_BUILD_ARGUMENTS" to "--initialize-at-run-time=io.netty.handler.ssl.BouncyCastleAlpnSslUtils -H:MaxHeapSize=2g -H:Threads=2"
    

2. Docker容器级资源限制

通过Spring Boot的Docker配置直接限制构建容器的资源配额(需Spring Boot 2.6+):

tasks.withType<BootBuildImage> {
    docker {
        resources {
            memory.set("3g") // 匹配CodeBuild实例总内存
            cpus.set(2.0) // 匹配实例vCPU数量
        }
    }
}

如果是直接调用Docker命令构建,可添加参数:

docker build --memory=3g --cpus=2 ...

3. CodeBuild构建规范优化

在buildspec.yml中添加环境变量,限制Gradle与构建工具的内存占用:

env:
  variables:
    GRADLE_OPTS: "-Xmx1g -XX:MaxMetaspaceSize=256m"
    DOCKER_BUILDKIT: "1" # 启用BuildKit优化资源使用效率

4. 额外GraalVM内存优化参数

可添加以下参数进一步降低内存峰值:

  • -H:ClassInitialization=io.netty.handler.ssl.BouncyCastleAlpnSslUtils:精准控制类初始化时机,替代--initialize-at-run-time
  • --exclude-config:排除不必要的配置文件分析
  • --no-fallback:禁用回退模式,减少内存占用

内容的提问来源于stack exchange,提问作者rafallezanko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 19:01:52