【问题标题】:JVM error when using paperclip to upload large files使用回形针上传大文件时出现 JVM 错误
【发布时间】:2013-03-27 02:59:20
【问题描述】:

我正在使用 rails 3 + 回形针来托管我的文件管理应用程序。

但是,回形针似乎无法处理大文件 (>= 200 MB)

在它给我的开发环境中:

JVMDUMP006I Processing dump event "systhrow", detail "java/lang/OutOfMemoryError" - please wait.
JVMDUMP032I JVM requested Snap dump using '/home/ubuntu/upload/Snap.20130322.123321.12125.0001.trc' in response to an event
JVMDUMP010I Snap dump written to /home/ubuntu/upload/Snap.20130322.123321.12125.0001.trc
JVMDUMP032I JVM requested Heap dump using '/home/ubuntu/upload/heapdump.20130322.123321.12125.0002.phd' in response to an event
JVMDUMP010I Heap dump written to /home/ubuntu/uploadheapdump.20130322.123321.12125.0002.phd
JVMDUMP032I JVM requested Java dump using '/home/ubuntu/upload/javacore.20130322.123321.12125.0003.txt' in response to an event
JVMDUMP010I Java dump written to /home/ubuntu/upload/javacore.20130322.123321.12125.0003.txt
JVMDUMP013I Processed dump event "systhrow", detail "java/lang/OutOfMemoryError".
[2013-03-22 12:33:42] ERROR

在生产环境中,我将此应用程序部署为 WAR 文件并上传到 tomcat 服务器,它没有给我任何错误,但上传的文件已损坏。

知道如何解决这个问题吗?

谢谢!

更新

我修改了一些 tomcat 连接器配置并得到了这个错误:

IOError (Disk quota exceeded): app/controllers/submissions_controller.rb:73:in `create'

但我 100% 确定我有足够的空间使用。

【问题讨论】:

  • 你如何下载/上传代码中的文件?
  • <%= upload.file_field :package, :accept => "application/x-zip-compressed"%>
  • 为JVM分配了多少内存?
  • 一开始没碰过,应该是默认值
  • 如果您有物理内存,请按照我的建议进行设置。 JAVA_OPTS="-server -Xms512m -Xmx1024m -XX:MaxPermSize=128m -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000"

标签: ruby-on-rails tomcat paperclip


【解决方案1】:
  • 某些平台可能破坏了构建的 sendfile 支持 系统 没有检测到,特别是如果二进制文件是建立在另一个盒子上的 并转移到这样一台支持损坏的 sendfile 的机器上。

  • 在 Linux 上使用 sendfile 会触发 TCP 校验和卸载错误 使用 IPv6 时在某些网卡上。

  • 使用网络挂载的目录(例如 NFS 或 SMB),内核 可能无法通过自己的缓存服务网络文件。

useSendfile="false" 添加到server.xml 中的Tomcat 连接器

<Connector  ...
       useSendfile="false"
/>

要检查的其他配置

  1. 体面的内存分配和超时

    JAVA_OPTS="-server -Xms256m -Xmx1024m -XX:MaxPermSize=128m -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000"
    
  2. Tomcat 连接器选项

ma​​xPostSize(104857600 == 100 兆字节,默认值 = 2 兆字节)

将由 POST 处理的最大字节数 容器FORM URL参数解析。该功能可以通过禁用 将此属性设置为小于或等于 0 的值。如果不是 指定时,此属性设置为 2097152(2 兆字节)。另外两个 要检查的配置是超时限制和 maxFileSizeLimit

disableUploadTimeout(确保未设置为 false)

该标志允许 servlet 容器使用 servlet 运行时不同的、更长的连接超时 执行,最终允许 servlet 更长的数量 完成其执行的时间,或数据期间更长的超时 上传。如果未指定,则将此属性设置为“true”。

ma​​xHttpHeaderSize(尝试加倍)

请求和响应 HTTP 标头的最大大小,在 字节。如果未指定,则此属性设置为 4096 (4 KB)

【讨论】:

  • 我尝试添加 useSendfile="false"maxPostSize="0"(无限) 但它不起作用,感谢您的回答!
猜你喜欢
  • 2014-08-19
  • 2014-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-22
相关资源
最近更新 更多