【问题标题】:How to solve OutOfMemoryError?如何解决 OutOfMemoryError?
【发布时间】:2012-02-12 18:00:52
【问题描述】:

对于学校项目,我必须编写不同类型的算法。问题是,我有一个可行的算法。但我必须运行它几次,一段时间后它给了我以下错误:

线程“主”java.lang.OutOfMemoryError 中的异常:Java 堆空间

我知道错误的含义,但是是否可以让 Java 在运行期间搜索空白空间?我知道它使用了很多空间,在某些时候没有使用。它在应用程序运行期间将很多对象设置为 null 并创建很多新对象,因此内存不足。

那么具体:是否可以让 JVM 释放一些设置为 null 的空间?或者在程序运行时释放一些空间?我知道我可以将 JVM 设置为更多空间,但迟早我会遇到同样的问题。

如果您需要我的 IDE(如果它是 IDE 特定的),那就是 Eclipse。

【问题讨论】:

  • 除非你的记忆力很小,否则你很有可能做错了什么......对于大多数学校项目来说,真的不应该面临记忆问题
  • stackoverflow.com/a/5121287/20394 特别谈到了在 Eclipse 下运行时如何增加内存量,该文章的其余部分涉及诊断和修复内存问题的策略。
  • 第一步:充分了解你的程序允许使用多少内存,你的程序应该使用多少内存,以及它实际使用了多少。
  • 除了 [粗略] 估计您的程序创建的对象数量之外,分享您拥有的系统内存量也是有益的。或者,您可以跟踪jconsole 使用了多少内存,并查看在什么时间使用了多少。

标签: java jvm out-of-memory


【解决方案1】:

请谷歌“垃圾收集”。 Java 一直在寻求重用您不使用的对象的空间。如果内存不足,您要么需要使用 -Xmx 来配置更多内存,要么必须修复代码以保留更少的对象。您可能会发现像 jvisualvm 这样的分析器会帮助您发现浪费的内存使用情况。

【讨论】:

    【解决方案2】:

    如果您使用的是 Oracle/Sun JVM,我建议您下载 Visual VM 1.3.3,安装所有插件,然后启动它。它将向您展示每个堆生成、线程、CPU、对象等中发生的情况。它可以告诉您哪个类占用了最多的堆空间。

    如果你有数据,你会很快弄清楚的。

    【讨论】:

      【解决方案3】:

      我会使用内存分析器来确定内存的使用位置。设置为 null 很少有帮助。在您获得 OOME 之前,GC 将始终运行并释放尽可能多的空间。

      【讨论】:

        【解决方案4】:

        问:“是否可以让JVM释放一些设置为null的空间?或者在程序运行的时候释放一些空间?”

        答:是的,调用System.gc() 可以做到这一点,但这不太可能解决您的问题,因为系统会不时自动执行此操作。您需要找到正在使用所有内存的对象并在您的代码中修复它。可能是一个永远不会被清除而只会被添加到的列表。

        我实际上在实现一个需要大量数据结构的特别复杂的算法时遇到了这个问题。我不得不来这个网站上发布一个问题。事实证明,为了避免内存错误,我必须完全使用一种完全不同类型的对象。

        这是question

        【讨论】:

        • 谢谢,这将是一个非常有用的答案。我可以在循环中使用暂停,让 Java 收集它的碳水化合物并检查它是否再次工作。
        【解决方案5】:

        GC 会自动回收“未使用”的内存,所以是的,可以在运行时释放一些空间,但了解哪些内容被归类为可能被回收是至关重要的。 基本上,如果对象本身无法访问,则可以回收(垃圾收集)对象的空间-没有对其的引用。当您说“将空间设置为空”时,您很可能通过将其设置为空来删除对象的一个​​链接(引用)。这将允许回收对象仅当是唯一的链接(参考)

        Object First= new Object();   //first object
        Object Second= new Object();  //second object 
        Object SecondPrim=Second;     //second reference to second object
        
        First=null;   
        // First memory will be reclaimed (sooner or later)
        Second=null;
        // there is still a reference to second object via SecondPrim
        // second object will not be reclaimed
        

        希望这会有所帮助。至于检查到底发生了什么,我会建议您分析您的程序。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-04-11
          • 2015-11-17
          • 2015-07-29
          • 1970-01-01
          • 2021-01-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多