应用的是ssh框架,里面的下载是这样实现的:
连接对应的ftn服务器下载文件到内存的byte数组中。
把byte数组通过这种形式返回给客户端
@Result(name = "download", type="stream",params={ "contentType","application/octet-stream", "inputName","inputStream", "contentDisposition","attachment;filename=${fileName}", "bufferSize","4096"})})
这个inputStream是这样定义的:
public InputStream getInputStream(){ return new ByteArrayInputStream(filebuf);//filebuf就是那个内存中的byte数组。 }
本来是没什么问题的,但是应用正式上线之后在客户端点击下载越来越慢,有的时候要等好几分钟才出来下载提示框。尝试着把应用重启后又恢复正常了。
于是我判断是内存没有释放,我想问一下在点击下载时,出来下载提示框之后,如果客户端一直不点击保存按钮,那么服务器端的那个提供下载的输出流是不是一直保持那个在内存中的状态?(是否是因为这个原因导致内存占满,性能降低?)
如果出来下载提示框之后直接alt+f4关闭页面,服务器端的输出流又会怎样呢?
确实会卡住一个线程,但不至于内存站满,因为只要写入缓存区满了之后就不会写入了,会等待直到超时,而如果直接ALT+F4的话会异常,但不影响程序。个人认为还是程序问题,自己找找吧
”....因为只要写入缓存区满了之后就不会写入了....“,这句话应该怎么理解呢?
我想问一下在点击下载时,出来下载提示框之后,如果客户端一直不点击保存按钮,那么服务器端的那个提供下载的输出流是不是一直保持那个在内存中的状态?
不会,弹出提示框-用户不点保存 这样只会阻塞一个线程而已。
但是你说那个什么输出流是不是保存在内存的状态,是不是说这个流被用户占着不放的意思?
不会的,没点保存还没正式传输前,浏览器端都不会获取到这个流。