下载大文件出现直接内存溢出: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
崇尚极简,热爱技术,喜欢唱歌,热衷旅行,爱好电子产品的一介码农。
联系QQ:58742094
联系电话:
工作邮箱:
当你的才华还撑不起你的野心的时候,你就应该静下心来学习,永不止步!
人生之旅历途甚长,所争决不在一年半月,万不可因此着急失望,招精神之萎葸。
Copyright 2015- 芒果酷(mangocool.com) All rights reserved. 湘ICP备14019394号
免责声明:本网站部分文章转载其他媒体,意在为公众提供免费服务。如有信息侵犯了您的权益,可与本网站联系,本网站将尽快予以撤除。