使用jersey时,我遇到了一个提供大文件的OOM异常。我认为通过使用StreamingOutput
,我会避免将整个文件保留在内存中,从而避免出现OOM异常,但似乎并非如此。这就是我们构建StreamingOutput
:
StreamingOutput streamingOutput = new StreamingOutput() {
@Override
public void write(OutputStream outputStream) throws IOException, WebApplicationException {
final InputStream is = tis.getInputStream();
byte[] bbuf = new byte[1024 * 8];
long total = 0;
int length;
while ((is != null) && ((length = is.read(bbuf)) != -1)) {
outputStream.write(bbuf, 0, length);
total += length;
log.trace("Copied {} of {}", total, tis.getFileLength());
}
outputStream.flush();
is.close();
outputStream.close();
}
};
responseBuilder = Response.ok(streamingOutput, tis.getStreamType());
是一个typedInputStream ...
我是否错误地认为这会阻止整个文件进入内存?我正在使用tomcat 7.我有一堆免费堆,所以当我尝试下载1.5 gig文件时,会抛出一个OOM异常。这段代码有错吗?查看堆转储,似乎所有内存都被字节数组使用,我不确定是否可以使用堆转储来确定字节数组初始化的确切位置。