Jersey StreamingOutput导致OOM异常

时间:2015-09-25 16:37:57

标签: java tomcat memory jersey out-of-memory

使用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异常。这段代码有错吗?查看堆转储,似乎所有内存都被字节数组使用,我不确定是否可以使用堆转储来确定字节数组初始化的确切位置。

0 个答案:

没有答案