文件上传量较大时出现内存不足

时间:2015-11-15 09:38:03

标签: scala jetty embedded-jetty scalatra jetty-9

我的Jetty服务器上传文件的问题比较严重  Trace

我上传为Multipart / form-data,并使用scalatra的FileUploadSupport(如下所示)从请求中提取文件

class foo extends ScalatraServlet with FileUploadSupport {
  configureMultipartHandling(MultipartConfig(maxFileSize = Some(1073741824)))
  post("/upload") {
    //{1}
    ... //(VALIDATION AND USER LOGIN WITH SCENTRY)
    ... //(Transactionally posts meta info to Elasticsearch and writes video to filesystem)
  }
}

我有一系列测试,如果在localhost上运行服务器,使用较小的文件~50MB甚至3-400MB文件都没有问题。

但是,当我在远程计算机上托管我的服务器时,我遇到了一些传输特定的问题。而且,(调试时),我从未到达{1}

的断点

研究我发现的问题this这表明重用相同的http连接可能会导致问题。根据他们的建议,我将以下内容添加到我的servlet中,并在分析响应头时我可以确认它"采取":

before("/*") {
  response.addHeader("Connection", "close")
}

我的研究还显示了包含太多表单密钥的一些问题,但是有问题的表单只有4个密钥,而且我在本地主机上看不到问题,或者在远程计算机上看不到小文件。

此上传通过https(如果相关)与CA签名证书进行,并且谷歌浏览器接受为安全的私有连接。

设置服务器连接器时,我在发生任何问题的情况下更改了空闲超时值

httpsConnector.setIdleTimeout(300000)

尽管做了这些修改,我还没有克服这个问题,我感谢您提出的任何建议。

EDIT1-SOLVED-

我相信我已经分配了4G的堆空间,因此这是一个非常规的错误。原来我在localhost上运行的版本来自intellij,它有自己关于堆大小的想法。

在远程机器上运行" sbt run"我忽略了在我的build.scala中包含fork选项。因此,sbt忽略了我的jvm选项(无法在正在运行的jvm上设置选项)而且我运行的是300mb堆。

1 个答案:

答案 0 :(得分:2)

您的跟踪显示内存不足异常。显然上传文件时内存不足。

您是否尝试过增加堆大小?这是远程服务器和本地服务器之间的区别吗?