如何避免OutOfMemoryError上传文件?

时间:2010-10-19 08:18:44

标签: java resin

我正在尝试上传图片文件。上传大小约为40到200kb的文件时,一切都很好。但是当我尝试上传大小为459kb的文件时,有时会上传,有时会显示OutOfMemoryError。我不认为文件大小对于抛出此错误而言非常大。我正在使用树脂。是否有可能存在阻止上传大尺寸文件的树脂设置?因为在代码中我无处设置任何文件上传的最大大小。

任何人都有任何想法如何避免这种情况。我希望用户上传任意大小约10 MB的图像。

3 个答案:

答案 0 :(得分:1)

当没有足够的内存可用于特定操作时(例如对象的实例化),JVM会抛出

OutOfMemoryError

为避免此类错误,您可以使用特定选项在启动时增加JVM的内存,具体取决于您的JVM(通常为-xmx512m,512 megas)

在您的情况下,这种小型上传不应生成任何OutOfMemoryError,我建议使用Memory Analyzer之类的工具来识别错误的来源。

答案 1 :(得分:1)

如果内存不足,首先要检查的是JVM分配了多少内存。您没有说Resin是如何运行的,或者它正在使用哪个JVM或OS /主机,但通常JVM将受默认堆大小和最大堆大小的控制。从命令行,标准JVM具有管理这些值的-Xms-Xmx参数。当JVM启动时,它会分配默认堆,并允许它增长到最大值。当分配超过最大堆时,它可能会尝试释放任何软/弱引用和其他可处理资源,强制执行GC,但如果它仍然没有足够的空间,则会抛出OutOfMemoryException。因此,更改值可能会影响何时发生。

要寻找的第二件事是如何在服务器中分配内存。例如,如果您的服务器在内存中包含大量内容并且具有强引用,则可能会耗尽内存,如果是这样,请考虑使用弱引用或类似Ehcache之类的内容将内容移出磁盘。或者,如果您的servlet由于某种计算错误而分配MB而不是KB。无论如何,您不应该尝试将整个输入读入内存。假设您正在实现一个servlet,那么提供的ServletRequest / HttpServletRequest允许您访问POSTDATA的输入流,您可以以块(例如,每次32KB)读取它并将其写入块中的输出缓冲区。作为一般的经验法则,读取离散块中的输入数据无论如何都是更好的做法,因为您不希望不受信任的数据通过向您传递一些大量文件来破坏您的服务器。

答案 2 :(得分:0)

尝试启动应用程序时,设置堆和保留区域的最大和最小大小

使用Xmx Xms Xss