我正在尝试上传图像文件。当上传大约40至200kb的文件时,一切都很好。但是,当我尝试上传大小为459KB的文件时,有时会上传,有时会显示OutofMemoryError。我认为文件大小并不是很大,因为要丢弃此错误。我正在使用树脂。是否有可能有一个树脂设置可以防止上载大型文件?因为在代码中,我无处可为文件上传设置任何最大尺寸。

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

有帮助吗?

解决方案

如果您的内存不足,首先要检查的是您分配了多少内存。您不会说树脂的运行方式或使用哪个JVM或OS /主机,但通常会由JVM受默认的堆尺寸和AA最大堆大小来控制。从命令行,标准JVM具有 -Xms-Xmx 控制这些值的参数。当JVM启动时,它会分配默认堆,并允许其生长至最大值。当分配超过最大堆时,可能会尝试释放任何软 /弱参考和其他一次性资源,请强制GC,但是如果它仍然没有足够的空间,它将抛出 OutOfMemoryException. 。因此,更改值会在发生这种情况时会影响。

要查找的第二件事是如何在服务器中分配内存。例如,如果您的服务器在内存中存放一堆具有强烈参考的内存中,则可以用完存储器,如果是这样,请考虑使用弱参考或类似的内容。 ehcache 将东西移到磁盘上。或者,由于某种计算误差,您的servlet是分配MB而不是KB。无论如何,您都不应该尝试将整个输入读取到内存中。假设您正在实施servlet,然后提供 ServletRequest / HttpServletRequest 允许您访问PostData的输入流,并可以在块中阅读(例如32KB),并将其写入块中的输出缓冲区。无论如何,作为一般的经验读数输入数据,无论如何,在离散块中的输入数据都是更好的练习,因为您不希望不受信任的数据能够通过将一些大量文件传递给您来破坏服务器。

其他提示

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

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

在您的情况下,如此小的上传不应生成任何OutofMemoryError,我建议使用诸如此类的工具 内存分析仪 确定错误的起源。

在尝试启动应用程序的同时,设置了堆和预留区域的最大和最小尺寸

使用XMX XMS XSS

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top