同样的文件,http传送能成功,ftp报了一个内存溢出。

FTP内存溢出的原因

retrieveFile(localFileName, result):将一个文件从ftp服务器转化到输出流中
在用户发出请求后,服务器发送数据,直到数据交互完成后再通知用户。由于一直保存在输出流中,没有转换为数据存在硬盘,所以在传输完成前就会一直累积在内存(通过观察内存显示 可以得出内存明显增加),累积到一定程度超过虚拟机限制就会报错。
解决方案:很明显不能一直把数据存在内存,应该在接收过程中及时释放,于是上网找了另一个api
ftpClient.retrieveFileStream(localFileName):获得一个输入流,缓冲区为65535,缓冲区满会阻塞等待程序消费,然后继续往缓冲区发送。
修改后的代码

  1. //得到的输入流
  2. InputStream inputStream= ftpClient.retrieveFileStream(localFileName);
  3. OutputStream output = new FileOutputStream("a.zip");
  4. byte[] buf = new byte[1024];
  5. int bytesRead;
  6. //转为输出流
  7. while ((bytesRead = inputStream.read(buf))!=-1) {
  8. output.write(buf, 0, bytesRead);
  9. }

api文档
https://www.cnblogs.com/aipan/p/7456484.html

HTTP

http下载发送4G的文件成功了,显然http不会一股脑的把流存进内存再一点点发,继续做了个实验,在程序运行的时候内存没有像FTP那样累积增加,增加量十分少,在中断程序之后,传输截至,所以http在发送中是将流一点一点向客户端发送的。输入流只是得到一组信息(地址等),并未将所有数据存入内存
实验:
断点测试
当往respond输出流达到一定程度时(6000字节左右),浏览器出现了下载框,证明后台自动向浏览器发送响应了。
image.png
image.png
关闭程序发现下载断开。