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

使用SpringBoot上传5GB文件时遭遇OutOfMemoryError问题求助

SpringBoot大文件上传OutOfMemoryError解决方案

出现这个问题的核心原因是:SpringBoot默认会将上传的文件全部加载到JVM内存中,5GB的大文件直接占满内存,触发OutOfMemoryError。

以下是具体解决办法:

  • 配置SpringBoot文件上传参数,开启磁盘缓存
    在application.properties(或application.yml)中添加如下配置,让大文件超过阈值后写入临时磁盘目录,而非全部存在内存:

    spring.servlet.multipart.enabled=true
    spring.servlet.multipart.max-file-size=5GB
    spring.servlet.multipart.max-request-size=5GB
    # 文件超过1MB就写入磁盘临时目录
    spring.servlet.multipart.file-size-threshold=1MB
    # 指定临时文件存储路径,可根据实际调整
    spring.servlet.multipart.location=/tmp/upload-temp
    
  • 采用流式处理读取文件,避免一次性加载到内存
    代码中使用MultipartFile的getInputStream()逐块读写,绝对不要用getBytes()(会把整个文件加载到内存),示例代码:

    @PostMapping("/upload")
    public String uploadLargeFile(@RequestParam("file") MultipartFile file) throws IOException {
        // 目标存储路径,自行替换
        String targetPath = "/data/uploads/" + file.getOriginalFilename();
        try (InputStream inputStream = file.getInputStream();
             FileOutputStream outputStream = new FileOutputStream(targetPath)) {
            // 4KB缓冲块,可根据服务器性能调整大小
            byte[] buffer = new byte[4096];
            int bytesRead;
            while ((bytesRead = inputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, bytesRead);
            }
        }
        return "文件上传成功";
    }
    
  • 临时应急:调整JVM堆内存(非根治方案)
    启动应用时添加JVM参数增大堆内存,比如-Xmx8G -Xms8G,但这只是临时缓解,大文件场景还是优先用磁盘存储+流式处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 11:50:32