大文件下载内存溢出防护:拒绝全量加载,零拷贝流式输出抗住万级并发!
做文件下载功能的同学肯定都遇到过这个问题:用户下载一个大文件,结果服务器内存飙升,最后 OOM 直接崩溃。特别是在处理视频、备份文件、日志压缩包等大文件时,这个问题尤为突出。 我之前就遇到过这样一个案例:一个用户反馈下载一个 5GB 的视频备份文件时,服务器直接宕机了。排查后发现,代码里居然是这样写的: @GetMapping("/download/{fileId}") public byte[] download(@PathVariable Long fileId) { File file = fileService.getFile(fileId); return Files.readAllBytes(file.toPath()); // 一次性加载到内存! } 这就是典型的"小文件思维"写大文件代码的案例。在低并发场景下可能没问题,但一旦并发上来,内存就会爆掉。 今天我们就来聊聊大文件下载的正确姿势,让你的系统轻松抗住万级并发。 大文件下载的内存问题根源 1. 传统方式的致命缺陷 很多开发者习惯用 Files.readAllBytes() 或者 FileInputStream.r....