25

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

内存不足错误:java堆空间

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

4

5 回答 5

41

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);
    }
}
于 2012-07-20T11:17:34.980 回答
4

这对我有用:

导出_JAVA_OPTIONS="-Xmx1g"

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

java -XshowSettings:vm

它会告诉你:

拿起_JAVA_OPTIONS:-Xmx1g

于 2017-06-01T14:00:32.073 回答
3

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

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

于 2012-07-20T11:15:50.450 回答
1

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

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

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

Xms指定初始内存分配池。

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

XX:MaxPermSize:最大永久代大小

于 2020-02-20T09:14:43.370 回答
-4

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

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

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

于 2013-10-08T18:22:03.187 回答