我对java堆内存有一个问题。我在java中开发了一个客户端服务器应用程序,它作为Windows服务运行,需要超过512MB的内存。我有2GB的RAM,但是当我运行我的应用程序时它会引发异常
内存不足错误:java堆空间
但是我已经在java控制面板中设置了堆大小(最大512MB),我仍然得到相同的错误。我无法通过命令行设置堆大小,因为我的应用程序作为Windows服务运行,所以如何增加默认堆大小?
答案 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设置可以通过适当的应用程序分析和负载测试来实现。