Getting “java.lang.OutOfMemoryError: Java heap space”
Getting “java.lang.OutOfMemoryError: Java heap space”
这是在我尝试下载 150mb 大小的文件时出现的。我有 JAVA_OPTS 如下。
if [ -f /root/.rs850 -o -f /root/.rs851 -o -f /root/.rs950 -o -f /root/.rs951 ]
JAVA_OPTS="$JAVA_OPTS -Xmx1024m -XX:MaxPermSize=128m"
else
JAVA_OPTS="$JAVA_OPTS -Xmx512m -XX:MaxPermSize=128m"
在用户的网络浏览器下载大文件之前,您的网络应用程序中的某些内容似乎正在缓冲内存中的大文件。 (您很容易消耗比您想象的更多的内存,具体取决于文件的性质以及它在内存中的读取和缓冲方式。)
有两种方法可以解决这个问题:
修改您的 webapp 中负责提供文件的代码,这样它就不需要在发送文件之前将其缓冲在内存中。
增加最大堆大小;例如将 -Xmx512
选项更改为(例如)-Xmx1024
.
不幸的是,第二种解决方案意味着您的 Tomcat 实例将使用更多内存。它也是创可贴。如果您需要下载更大的文件,您可能会 运行 再次陷入同样的问题。
还有一种可能是你的webapp有内存泄漏,150Mb下载触发OOME只是巧合。
这是在我尝试下载 150mb 大小的文件时出现的。我有 JAVA_OPTS 如下。
if [ -f /root/.rs850 -o -f /root/.rs851 -o -f /root/.rs950 -o -f /root/.rs951 ]
JAVA_OPTS="$JAVA_OPTS -Xmx1024m -XX:MaxPermSize=128m"
else
JAVA_OPTS="$JAVA_OPTS -Xmx512m -XX:MaxPermSize=128m"
在用户的网络浏览器下载大文件之前,您的网络应用程序中的某些内容似乎正在缓冲内存中的大文件。 (您很容易消耗比您想象的更多的内存,具体取决于文件的性质以及它在内存中的读取和缓冲方式。)
有两种方法可以解决这个问题:
修改您的 webapp 中负责提供文件的代码,这样它就不需要在发送文件之前将其缓冲在内存中。
增加最大堆大小;例如将
-Xmx512
选项更改为(例如)-Xmx1024
.
不幸的是,第二种解决方案意味着您的 Tomcat 实例将使用更多内存。它也是创可贴。如果您需要下载更大的文件,您可能会 运行 再次陷入同样的问题。
还有一种可能是你的webapp有内存泄漏,150Mb下载触发OOME只是巧合。