更改Tomcat 7中的setenv.sh文件时,Java.lang.OutOfMemory未解决

时间:2017-02-05 12:52:29

标签: java tomcat

我使用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"

请帮我解决这个问题。

3 个答案:

答案 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