我有一个运行在Tomcat 7上的Servlet应用程序。我在setenv.sh中设置了以下内容
CATALINA_OPTS=" -server -Xms1G -Xmx5G -XX:MaxPermSize=512m -Dfile.encoding=UTF-8";
服务器运行在Ubuntu 12.04LTS上,有6个内核和8GB的RAM。 我的应用程序是一个Grails / Spring / Java应用程序,用户可以上传图片。 有时会出现3-5个用户同时开始上传图像的情况。 在这些情况下,我的Tomcat崩溃,因为有以下错误:
java.lang.OutOfMemoryError: Java heap space
我知道我必须增加我的Tomcat的Xmx参数来防止这个问题。 但是严重的是我的情况出了什么问题?
有没有最好的做法来处理像我的情况下file upload?
我可以防止这个问题一些如何? 我的意思是当5GB的时间不足以进行3-5个并行上传时,我需要几百个并行上传的资源?
是我的应用程序如此糟糕,或者是正常的file upload需要这么多的资源?
以下是在Grails控制器中处理上载的代码:
CommonsMultipartFile file = (CommonsMultipartFile) request.getFile('image') file.transferTo(new File("${storagePath}${fullFileName}"))
上传后,我做了很多image processing。 有没有办法排队的过程?
说实话,5G的堆已经相当多了。 向我们显示处理上传的代码path,并提供有关用户通常上传的大小和多个文件的一些信息。
这也可以帮助你(如果你使用Spring的MultipartFile的commons fileupload): https : //stackoverflow.com/questions/1693810/how-can-i-avoid-outofmemoryerrors-when-using-commons-fileuploads-diskfileitem-t
内存使用取决于应用程序的devise目的以及所有用户正在做什么。 所以没有人可以评论这个应用程序是否需要一定量的内存。 正如你所说的,你的解决scheme是按照错误信息所说的做,并增加Java堆空间的数量。