我在执行多线程程序时遇到以下错误:
java.lang.OutOfMemoryError: Java heap space
上述错误发生在其中一个线程中。
据我所知,堆空间仅由实例变量占用。如果这是正确的,那么为什么在运行一段时间后会出现此错误,因为实例变量的空间在对象创建时就已分配完毕。
有没有办法增加堆空间?
我应该对我的程序进行哪些更改,以便使用较少的堆空间?
我在执行多线程程序时遇到以下错误:
java.lang.OutOfMemoryError: Java heap space
上述错误发生在其中一个线程中。
据我所知,堆空间仅由实例变量占用。如果这是正确的,那么为什么在运行一段时间后会出现此错误,因为实例变量的空间在对象创建时就已分配完毕。
有没有办法增加堆空间?
我应该对我的程序进行哪些更改,以便使用较少的堆空间?
如果您想增加堆空间,可以在命令行中使用java -Xms<初始堆大小> -Xmx<最大堆大小>
。默认情况下,这些值基于JRE版本和系统配置。您可以在Java网站上了解更多有关VM选项的信息。
然而,我建议您对应用程序进行分析,以查找为什么堆大小会增长的原因。NetBeans附带了一个非常好的分析工具。我相信它在内部使用了jvisualvm
。通过分析工具,您可以尝试找到创建许多对象的位置、对象何时被垃圾回收等信息。
1.- 是的,但它基本上指的是程序使用的整个内存。
2.- 是的,请查看Java VM选项。
-Xms<size> set initial Java heap size
-Xmx<size> set maximum Java heap size
Ie
java -Xmx2g
将最大分配2GB的内存给你的应用程序。
但你应该先检查是否存在内存泄漏。
3.这取决于程序。尝试查找内存泄漏。这个问题很难回答。最近,您可以使用JConsole进行剖析,以找出内存消耗的位置。
尝试更精确地描述您正在进行的操作,在长期运行中,您可能会发现程序变得更好。好吧!我将为JVM提供1G的RAM。
public class GetHeapSize {
public static void main(String[] args) {
long heapsize = Runtime.getRuntime().totalMemory();
System.out.println("heapsize is :: " + heapsize);
}
}
然后你可以使用以下命令增加堆大小:java -Xmx2g
http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html
- 如何更改程序以减少堆空间的使用?
这取决于您的应用程序。
根据应用程序要求设置最大堆内存。
不要在应用程序中造成内存泄漏。
如果在应用程序中发现内存泄漏,请使用 MAT、Visual VM、jconsole 等分析工具查找根本原因。一旦找到原因,修复内存泄漏。
来自 Oracle 文章 的重要提示。
原因:详细消息Java堆空间表示无法在Java堆中分配对象。此错误并不一定意味着存在内存泄漏。要增加堆大小,您可以在启动Java时使用-Xmx参数;例如:
-Xmx256M
在大多数情况下,代码并没有经过优化。释放掉那些你认为以后不再需要的对象。避免在循环中每次创建对象。尝试使用缓存。我不知道你的应用程序具体如何运行。但是,在编程中,生活中的一条规则同样适用:
预防胜于治疗。"不要创建不必要的对象"
本地变量位于堆栈上。对象占用堆空间。
您可以使用-Xmx
选项。
基本上,每次使用new
分配新对象时都会使用堆空间,并在对象不再被引用后释放。因此,请确保您不保留不再需要的对象引用。