如何永久增加java堆内存?

时间:2012-07-20 11:09:08

标签: java jvm heap heap-memory heap-dump

我对java堆内存有一个问题。我在java中开发了一个客户端服务器应用程序,它作为Windows服务运行,需要超过512MB的内存。我有2GB的RAM,但是当我运行我的应用程序时它会引发异常

  

内存不足错误:java堆空间

但是我已经在java控制面板中设置了堆大小(最大512MB),我仍然得到相同的错误。我无法通过命令行设置堆大小,因为我的应用程序作为Windows服务运行,所以如何增加默认堆大小?

5 个答案:

答案 0 :(得分:36)

Java虚拟机采用两个命令行参数来设置初始和最大堆大小:-Xms和-Xmx。您可以添加名为_JAVA_OPTIONS的系统环境变量,并在那里设置堆大小值 例如,如果您想要512Mb初始堆和1024Mb最大堆大小,可以使用:

Windows下的

SET _JAVA_OPTIONS = -Xms512m -Xmx1024m
Linux下的

export _JAVA_OPTIONS="-Xms512m -Xmx1024m"

可以使用Runtime类的totalMemory()方法以编程方式读取默认JVM堆大小。使用以下代码读取JVM堆大小。

public class GetHeapSize {
    public static void main(String[]args){

        //Get the jvm heap size.
        long heapSize = Runtime.getRuntime().totalMemory();

        //Print the jvm heap size.
        System.out.println("Heap Size = " + heapSize);
    }
}

答案 1 :(得分:2)

如果你需要增加预留内存,有VM参数-Xms和-Xmx,用法例如-Xms512m -Xmx512m。还有参数-XX:MaxPermSize = 256m,它更改为永久生成保留的内存

如果您的应用程序作为Windows服务运行,则在控制面板中 - >管理工具 - >您可以向服务添加一些运行参数的服务

答案 2 :(得分:1)

这对我有用:

export _JAVA_OPTIONS =“ - Xmx1g”

重要的是你没有空格,因为对我来说它不起作用。我建议只是复制和粘贴。然后我跑了:

java -XshowSettings:vm

它会告诉你:

拿起_JAVA_OPTIONS:-Xmx1g

答案 3 :(得分:1)

您还可以在下面使用它来扩展内存

export _JAVA_OPTIONS="-Xms512m -Xmx1024m -Xss512m -XX:MaxPermSize=1024m"

Xmx指定Java虚拟机(JVM)的最大内存分配池

Xms指定初始内存分配池。

Xss设置线程堆栈的内存大小

XX:MaxPermSize:最大永久代大小

答案 4 :(得分:-4)

请注意,在java.lang.OutOfMemoryError: Java heap space之后增加Java堆大小通常只是一个短期解决方案。

这意味着即使您将默认Java堆大小从512 MB增加到2048 MB,如果您正在处理内存泄漏,您仍可能在某些时候出现此错误。要问的主要问题是为什么你首先得到这个OOM错误?它真的是Xmx值太低还是仅仅是另一个问题的症状?

在开发Java应用程序时,在早期了解其静态和动态内存占用要求始终至关重要,这有助于防止以后出现复杂的OOM问题。正确选择JVM Xms& Xmx设置可以通过适当的应用程序分析和负载测试来实现。