MangoCool

下载大文件出现直接内存溢出:java.lang.OutOfMemoryError: Direct buffer memory

2023-12-29 15:38:07   作者:anobody   来源:MangoCool

下载大文件出现直接内存溢出:java.lang.OutOfMemoryError: Direct buffer memory

问题就在于代码中一次性读取大文件,然后返回流数据,错误代码如下:

File file = new File(fileRealPath);
bytes = FileUtils.readFileToByteArray(file);

在内存不足,或者并发读取大文件的情况下,很容易直接挤爆物理内存

正确处理方式:

try (FileInputStream fis = new FileInputStream(fileRealPath)) {
    ServletOutputStream out = response.getOutputStream();
    File file = new File(fileRealPath);
    response.setHeader("Content-Type", "application/octet-stream");
    response.setHeader("Content-Length", file.length() + "");
    response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));
    
    byte[] buffer = new byte[4096];
    int bytesRead = 0, bytesBuffered = 0;
    while ((bytesRead = fis.read(buffer)) != -1) {
    	out.write(buffer, 0, bytesRead);
    	bytesBuffered += bytesRead;
    	if (bytesBuffered > 1024 * 1024) { //flush after 1MB
    		bytesBuffered = 0;
    		out.flush();
    	}
    }

} catch (Exception e) {
	e.printStackTrace();
}

每次从文件中读出4096字节数据,然后达到1MB时就刷新一下缓存,将内存中的数据全部写出。

标签: java 下载、大文件、内存溢出

分享:

上一篇Unable to open socket file: target process not responding or HotSpot VM not loaded

下一篇MultipartFile file.getBytes() Java heap space

关于我

崇尚极简,热爱技术,喜欢唱歌,热衷旅行,爱好电子产品的一介码农。

座右铭

当你的才华还撑不起你的野心的时候,你就应该静下心来学习,永不止步!

人生之旅历途甚长,所争决不在一年半月,万不可因此着急失望,招精神之萎葸。

Copyright 2015- 芒果酷(mangocool.com) All rights reserved. 湘ICP备14019394号

免责声明:本网站部分文章转载其他媒体,意在为公众提供免费服务。如有信息侵犯了您的权益,可与本网站联系,本网站将尽快予以撤除。