Java 堆空间(带有大文件的 CMS)

标签 java memory tomcat

编辑:

得到了要生存的目录。现在还有另一个问题:

存储中的文件以其 DB id 作为前缀存储 到他们的文件名。我当然不希望用户看到这些。

有没有办法结合 response.redirect 和 header 设置 für 文件名和大小?

最好的,

     A

你好,

新方法:

是否可以在tomcat中创建类似IIS的虚拟目录 避免流式传输并仅使用 header 重定向?我玩过 上下文,但无法让它继续......

有什么想法吗?

    thx

一个

你好 %,

我正面临 Java 堆空间的有线问题,该空间很接近 把我带到绳索上。

简短的版本是:

我写了一个 ContentManagementSystem 需要处理 大文件(> 600mb)也是如此。 Tomcat 堆设置:

-Xmx700m -Xms400m

问题是,上传大文件是可行的,尽管它是 慢的。下载文件导致 java 堆空间异常。

尝试下载一个 370mb 的文件会使 tomcat 跳到 500mb 堆 (这应该没问题)并以 Java 堆空间异常结束。

我不明白,为什么上传有效而下载无效? 这是我的下载代码:

byte[] byt = new byte[1024*1024*2];

response.setHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\""); 

FileInputStream fis = null;
OutputStream os = null;

fis = new FileInputStream(new File(filePath));
os = response.getOutputStream();

BufferedInputStream buffRead = new BufferedInputStream(fis);

while((read = buffRead.read(byt))>0)            
{
    os.write(byt,0,read);
    os.flush();
}

buffRead.close();
os.close();

如果我做对了,缓冲阅读器应该会处理任何问题 内存问题,对吧?

任何帮助将不胜感激,因为我已经没有想法了

最好的问候,

W

最佳答案

If I'm getting it right the buffered reader should take care of any memory issue, right?

不,这与内存问题无关,它实际上是不必要的,因为您已经在使用缓冲区来读取文件。你的问题是写作,而不是阅读。

我看不出您的代码有任何问题。看起来 Tomcat 正在缓冲整个响应而不是流式传输。我不确定是什么原因造成的。

response.getBufferSize() 返回什么?您应该尝试将 response.setContentLength() 设置为文件的大小;我依稀记得 Web 容器在某些情况下会缓冲整个响应以确定内容长度,所以也许这就是正在发生的事情。无论如何都这样做是一种很好的做法,因为它使客户端能够显示下载大小并为下载提供预计到达时间。

关于Java 堆空间(带有大文件的 CMS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1000219/

相关文章:

java - 单例与 Intent (Android)

Android - 背景图片占用太多内存

ios - 处理字符串内存的最佳方法

java - Tomcat 7 中的 ClassNotFoundException

java - 如何修改 401 tomcat 错误响应?

java - Hibernate 映射 - 一张表中的两个映射

java - Jgit:Bare Repository 既没有工作树,也没有索引

java - 使用 maven 在 tomcat 中使用共享父 spring 上下文处理多 war 设置

java - 现代 JVM 可以不同地优化同一类的不同实例吗?

perl - 什么是强制 Perl 5 在 OS X 上快速耗尽内存的好方法?