在Tomcat 7中更改setenv.sh文件时未解决Java.lang.OutOfMemory问题

在Tomcat 7中更改setenv.sh文件时未解决Java.lang.OutOfMemory问题,java,tomcat,Java,Tomcat,我使用Tomcat7部署应用程序。我执行下面的代码来获取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) ma

我使用Tomcat7部署应用程序。我执行下面的代码来获取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服务器并重新执行程序。但OutOfMemory错误再次出现。 我更改了CATALINA_选项的参数,但它不起作用。并在setenv.sh文件中添加以下代码,但它也不起作用

export JAVA_OPTS="-Xms512M -Xmx1024M"
请帮助我解决此问题。

Runtime.getRuntime().maxMemory()返回JVM将尝试使用的最大内存量。

-Xmx1024M
时,它返回
1024M
。数组
matrixArr
需要分配
1024M*4
内存。这就是为什么在增加JVM堆大小后仍然会出现
java.lang.OutOfMemory
异常。

您无法在java VM中分配所有内存。它需要为程序代码、类定义和加载的许多类中的静态字段留出空间

此外,您正在分配一个整数数组(每片4字节),而
maxMemory
返回一个字节值

因此,如果
maxMemory
返回100,则尝试分配一个包含100个整数的数组,这至少需要400字节的空间


您可以使用
IntBuffer.allocateDirect
在Java堆外分配空间。

如果您的tomcat服务器运行在linux机器上,并且是从存储库安装的,请执行此操作。。编辑/etc/default/tomcat7。在JAVA_OPTS行中,将-Xmx的值替换为(2048m)。其他一切都保持不变。重新启动tomcat

可能重复的我认为您使用了错误的参数指定为最大可分配堆大小。见Thanx@beckyang。这有助于我找到解决方案。
export JAVA_OPTS="-Xms512M -Xmx1024M"