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

Out Of Memory Error with larger file uploads

我在将较大的文件上传到我的码头服务器时遇到了一些问题 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)
  }
}

我进行了一系列测试,没有问题运行 如果 运行 本地主机上的服务器,则使用较小的文件 ~50MB 甚至 3-400MB 文件。

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

处到达断点

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

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

我的研究还显示了表单键过多的一些问题,但是有问题的表单只有 4 个键,我在本地主机或远程计算机上的较小文件上没有看到这个问题。

此上传是通过带有 CA 签名证书的 https(如果相关)进行的,并且被 google chrome 接受为安全的私人连接。

设置服务器连接器时,我更改了空闲超时值以防出现任何问题

httpsConnector.setIdleTimeout(300000)

尽管进行了这些修改,我仍未解决这个问题,非常感谢您的任何建议。

EDIT1-已解决-

我相信我已经分配了 4G 的堆 space,因此这是一个无意义的错误。原来本地主机上的版本 i 运行 是通过 intellij 实现的,它对堆大小有自己的想法。

当 运行 它在带有 "sbt run" 的远程机器上时,我忽略了在我的 build.scala 中包含 fork 选项。因此 sbt 忽略了我的 jvm 选项(大概无法在 运行 jvm 上设置选项)并且我是 运行 一个 300mb 的堆。

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

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