我使用Tomcat 7来部署应用程序。我执行下面的代码来获取OutOfMemory错误。
Long maxMemorySize = Runtime.getRuntime().maxMemory();
model.addAttribute("memorySize",maxMemorySize);
int[] matrixArr = new int[(int) (maxMemorySize + 1)];
for(int i = 0; i < matrixArr.length; ++i)
matrixArr[i] = i+1;
出现错误后,我在tomcat / bin中创建了一个setenv.sh文件,并在其中添加了下面的代码。
export CATALINA_OPTS="-Xms512M -Xmx1024M"
然后重新启动Tomcat服务器并重新执行该程序。但是再次出现OutOfMemory错误。 我更改了CATALINA_OPTS的参数,但它不起作用。并在setenv.sh文件中添加以下代码,但它也不起作用。
export JAVA_OPTS="-Xms512M -Xmx1024M"
请帮我解决这个问题。
答案 0 :(得分:0)
Runtime.getRuntime().maxMemory()
返回JVM尝试使用的最大内存量
它会在1024M
时返回-Xmx1024M
。数组matrixArr
需要分配1024M*4
内存。这就是为什么在增加JVM堆大小后仍然会出现java.lang.OutOfMemory
异常的原因。
答案 1 :(得分:0)
您无法在Java VM中分配所有内存。它需要空间来容纳许多被加载的类中的程序代码,类定义和静态字段。
此外,您正在分配一个int数组(每个字节为4个字节),而maxMemory
返回一个以字节为单位的值。
因此,如果maxMemory
返回100,那么您尝试分配100个整数的数组,这至少需要400个字节的空间。
您可以使用IntBuffer.allocateDirect
在Java堆外部分配空间。
答案 2 :(得分:0)
如果您的tomcat服务器在Linux机器上运行并从存储库安装,请执行此操作..编辑/ etc / default / tomcat7。在行中JAVA_OPTS用(2048m)替换 -Xmx 的值。让其他一切都一样。重启tomcat