首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JVM/Tomcat在太多上传并行发生时崩溃(堆空间)?

JVM/Tomcat在太多上传并行发生时崩溃(堆空间)?
EN

Stack Overflow用户
提问于 2013-08-26 00:03:53
回答 1查看 1.5K关注 0票数 0

我在Tomcat 7上运行了一个Servlet应用程序。

代码语言:javascript
复制
CATALINA_OPTS="
-server 
-Xms1G 
-Xmx5G
-XX:MaxPermSize=512m
-Dfile.encoding=UTF-8";

服务器运行在Ubuntu12.04LTS上,有6个内核和8GB内存。我的应用程序是Grails/Spring/Java应用程序,用户可以在其中上传图像。有时,3-5个用户同时开始上传图片。在这种情况下,Tomcat会因为以下错误而崩溃:

代码语言:javascript
复制
java.lang.OutOfMemoryError: Java heap space

我知道我必须增加Tomcat的Xmx参数来防止这个问题。但说真的我的案子怎么了?

  1. 在我的场景中,是否有处理文件上传的最佳实践?
  2. 我怎么才能防止这个问题呢?我的意思是,当5GB不足以进行3-5并行上传时,我需要多少资源来处理数百个并行上传呢?
  3. 我的应用程序是如此糟糕,还是文件上传需要这么多资源是很正常的?

注意:用户上传的文件是2-8MB.

在我看来,这就是我的上传方式:

代码语言:javascript
复制
   <g:form method="post" action="save" enctype="multipart/form-data">
    <input type="file" name="file"/>
    <input type="submit"/>
   </g:form>

在我的主计长:

代码语言:javascript
复制
def file = request.getFile('image')
byte [] byteFile = file.getBytes()

在config/spre.groovy中,我做到了:

代码语言:javascript
复制
beans = { 
  multipartResolver(org.springframework.web.multipart.commons.CommonsMultipartResolver){

        // Max in memory 100kbytes
        maxInMemorySize=102400

    }

} 

上传的文件是图像。它们将被缩放并保存到磁盘中。

这些图像将保存为:

代码语言:javascript
复制
bytes [] currentImage = // some image in bytes ...
def newFile = new FileOutputStream(fullPath)
newFile.write(currentImage)
newFile.close()
EN

回答 1

Stack Overflow用户

发布于 2013-08-26 13:00:48

避免使用MultipartFile.getBytes(),而是使用MultipartFile.getInputStream()来避免将整个文件内容读入内存。

因此,将代码更改为:

代码语言:javascript
复制
def file = request.getFile('image')
InputStream inputStream = file.inputStream

您没有提到如何处理上传的文件,但请确保在应用程序的各个层中传递InputStream,如果希望最小化堆的使用,则不要转换为byte[]

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18434930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档