如何永久增加java堆内存?

Posted

技术标签:

【中文标题】如何永久增加java堆内存?【英文标题】:how to increase java heap memory permanently? 【发布时间】:2012-07-19 15:47:15 【问题描述】:

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

内存不足错误:java堆空间

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

【问题讨论】:

控制面板中的设置仅影响小程序和 Java Web Start 应用程序,因此不会对您的应用程序产生任何影响。 您如何将 java 作为 Windows 服务运行?通常,您用于执行此操作的任何实用程序都允许您指定命令行参数。 @Mr.Cool 你应该改变下面接受的答案。 【参考方案1】:

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);
    

【讨论】:

在 linux export _JAVA_OPTIONS="..." 上有效。验证:java -version 第一行应报告选项,例如:Picked up _JAVA_OPTIONS: -Xms512m -Xmx2048m 我不知道为什么会这样,但是 Java VM 永远无法为我启动多个堆选项(初始和最大)。 _JAVA_OPTIONS 中只有 1 个选项 _JAVA_OPTIONS 效果很好,也被 gradle 采纳了。【参考方案2】:

这对我有用:

导出_JAVA_OPTIONS="-Xmx1g"

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

java -XshowSettings:vm

它会告诉你:

拾取_JAVA_OPTIONS:-Xmx1g

【讨论】:

【参考方案3】:

如果你需要增加保留内存,有VM参数-Xms和-Xmx,用法e.g. -Xms512m -Xmx512m 。还有一个参数 -XX:MaxPermSize=256m 更改为永久生成保留的内存如果您的应用程序作为 Windows 服务运行,在控制面板 -> 管理工具 -> 服务中,您可以向服务添加一些运行参数

【讨论】:

我可以设置这样的环境变量“JAVA_OPT=-Xms512m -Xmx512m” 不确定,从未尝试过。如果你想试试,请把结果贴在这里;)我已经更新了我的帖子,你可以在windows服务中添加一些参数 JAVA_OPTS 环境变量通常特定于您正在运行的脚本(如 tomcat 启动脚本)。您不能假设设置它会产生任何影响。使用 _JAVA_OPTIONS,如下所述。它适用于 windows 和 linux,前提是您使用的是 oracle 提供的 jvm。不保证它可以在 JRockit 或 IBM jvm 上运行。 @Jan Hruby 我尝试过另一种方式。我为我的应用程序编写了服务包装器,并在服务包装器配置中指定了最大和最小 Java 堆,现在它工作正常,感谢您宝贵的 cmets。【参考方案4】:

你也可以用下面这个来扩充内存

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

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

Xms指定初始内存分配池。

Xss设置线程栈的内存大小

XX:MaxPermSize: 永久代的最大大小

【讨论】:

【参考方案5】:

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

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

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

【讨论】:

虽然您所说的没有错,但这不应该是公认的答案,因为它根本没有回答 OP 的问题。 是的,这个“答案”完全忽略了用户希望定期运行需要大量内存数据的作业的可能性......与内存泄漏无关。

以上是关于如何永久增加java堆内存?的主要内容,如果未能解决你的问题,请参考以下文章

Java堆内存又溢出了!教你一招必杀技

jvm 03-java堆内存模型

Java堆内存模型

JVM堆体系结构及其内存调优

JVM内存设置

如何在 Java ME 中增加堆大小?