我怎样才能得到一个“a”;java.lang.OutOfMemoryError:java堆空间;如果我的堆不是';你没吃饱吗?

我怎样才能得到一个“a”;java.lang.OutOfMemoryError:java堆空间;如果我的堆不是';你没吃饱吗?,java,memory,out-of-memory,visualvm,Java,Memory,Out Of Memory,Visualvm,我正在调试一个我一直在做(但不是最初创建的)相当大的项目,我注意到它有时会因OutOfMemoryError而崩溃。代码从文件中加载了大量数据,所以一般来说这并不完全令人惊讶 然而,让我困惑的是,我正在使用VisualVM 1.3.4来分析程序,它的行为不一致。我运行它的大多数时候,堆逐渐扩展到大约2GB(计算机有16GB的RAM;用于学术研究),使用的堆在下面越来越高。大约2GB,它将崩溃。不过,随着时间的推移,该程序不会处理更多的信息,因此它不应该在几分钟内将堆增加到2GB 不过,有时,我会

我正在调试一个我一直在做(但不是最初创建的)相当大的项目,我注意到它有时会因
OutOfMemoryError
而崩溃。代码从文件中加载了大量数据,所以一般来说这并不完全令人惊讶

然而,让我困惑的是,我正在使用VisualVM 1.3.4来分析程序,它的行为不一致。我运行它的大多数时候,堆逐渐扩展到大约2GB(计算机有16GB的RAM;用于学术研究),使用的堆在下面越来越高。大约2GB,它将崩溃。不过,随着时间的推移,该程序不会处理更多的信息,因此它不应该在几分钟内将堆增加到2GB

不过,有时,我会在大约30秒后突然崩溃,堆大小为250MB,使用中只有大约100MB。如果堆未满,如何获取
java.lang.OutOfMemoryError:java堆空间


编辑:我正在使用Eclipse运行该程序,我有VisualVM插件,因此它会自动启动。另外,我正在使用Java 7。

使用VM参数启动应用程序
-XX:+HeapDumpOnOutOfMemoryError

分析堆转储并找出导致问题的原因


是查找此类问题的极好工具。

使用VM参数启动应用程序
-XX:+HeapDumpOnOutOfMemoryError

分析堆转储并找出导致问题的原因


是发现此类问题的极好工具。

您需要设置JVM的最小和最大堆内存

设置JAVA_OPTS=“-Xms128m-Xmx256m”

类似的东西,但是有更大的价值,比如2G,4G等等

LE:大家都知道,不能强制JVM运行垃圾收集器(即使您可以要求),但有一些方法可以说服JVM通过空引用来清除某些项。另一件需要注意的事情是数据库对象,它可能是惰性初始化的。当您尝试创建超出最大堆内存的对象时,可能会出现该错误


另一个想法可能是某个迟钝的开发人员出于迟钝的原因,在某种方法中以编程方式抛出OutOfMemoryError。当您到达代码的这一部分时,就会得到(搜索项目)

您需要设置JVM的最小和最大堆内存

设置JAVA_OPTS=“-Xms128m-Xmx256m”

类似的东西,但是有更大的价值,比如2G,4G等等

LE:大家都知道,不能强制JVM运行垃圾收集器(即使您可以要求),但有一些方法可以说服JVM通过空引用来清除某些项。另一件需要注意的事情是数据库对象,它可能是惰性初始化的。当您尝试创建超出最大堆内存的对象时,可能会出现该错误


另一个想法可能是某个迟钝的开发人员出于迟钝的原因,在某种方法中以编程方式抛出OutOfMemoryError。当您到达代码的这一部分时,您会得到(搜索项目)

应用程序因OutOfMemoryError崩溃至少有两个原因

  • java堆对于它需要处理的数据量来说太小了。然后,您可以按照建议的Matei增加它,或者按照建议的Ajay分析堆转储

  • 你的应用程序泄漏内存。这意味着它在处理后会在内存中留下一些不需要的数据。那么从长远来看,增加堆并没有帮助。您可以选择堆转储分析(再次)或专门的内存泄漏检测工具,如


  • 应用程序因OutOfMemoryError崩溃可能至少有两个原因

  • java堆对于它需要处理的数据量来说太小了。然后,您可以按照建议的Matei增加它,或者按照建议的Ajay分析堆转储

  • 你的应用程序泄漏内存。这意味着它在处理后会在内存中留下一些不需要的数据。那么从长远来看,增加堆并没有帮助。您可以选择堆转储分析(再次)或专门的内存泄漏检测工具,如


  • 结果表明,崩溃是由使用OpenJDK JRE而不是Oracle的JRE造成的。我不知道OpenJDK中到底是什么缺陷导致它像这样崩溃,但改用Oracle的JRE最终解决了这个问题


    (我使用OpenJDK是因为我在一台Linux计算机上,在我之前有人在使用它进行开源工作。当我向他提到崩溃时,他认为这可能是原因。他是对的。)

    结果表明,崩溃是由使用OpenJDK JRE而不是Oracle的JRE引起的。我不知道OpenJDK中到底是什么缺陷导致它像这样崩溃,但改用Oracle的JRE最终解决了这个问题


    (我使用OpenJDK是因为我使用的是一台Linux计算机,在我之前有人在使用它进行开源工作。当我向他提到崩溃时,他认为这可能是原因。他是对的。)

    你有没有32位操作系统,没有大内存支持(PAE on win,Linux上的巨大内存内核?如果是,在32位系统上每个进程可能会遇到2GB内存段限制


    作为一种解决方法,尝试将JVM参数-Xss192k设置为每个线程分配192kb的堆栈空间,并将参数-Xmx1024m设置为使用不超过1GB的堆。

    您是否有一个没有大内存支持的32位操作系统(win上的PAE,linux上的巨型mem内核?如果是,在32位系统上每个进程可能会遇到2GB内存段限制


    作为一种解决方法,尝试将JVM参数-Xss192k设置为每个线程分配192kb的堆栈空间,并将参数-Xmx1024m设置为使用不超过1GB的堆。

    JVM的最大堆设置为多少?它不会自动调整到RAM的大小。什么