如何永久增加java堆内存?
Posted
技术标签:
【中文标题】如何永久增加java堆内存?【英文标题】:how to increase java heap memory permanently? 【发布时间】:2012-07-19 15:47:15 【问题描述】:Java 堆内存有一个问题。我在 java 中开发了一个客户端服务器应用程序,它作为 Windows 服务运行,它需要超过 512MB 的内存。我有 2GB 的 RAM,但是当我运行我的应用程序时,它会引发异常
内存不足错误:java堆空间
但我已经在 Java 控制面板中设置了堆大小(最大 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堆内存?的主要内容,如果未能解决你的问题,请参考以下文章