【问题标题】:Java, how does creating new objects effect Heap-size?Java,创建新对象如何影响堆大小?
【发布时间】:2016-07-04 05:05:50
【问题描述】:

我想清楚地了解创建新对象如何影响我的 RAM 使用。

我当前的游戏开始使用 52036424 字节的堆,但是,在创建新对象(敌人、子弹等)大约 1 分钟后,堆是 67036424 字节。

这是否意味着我有内存泄漏?或者这就是 Java 的工作方式?创建新对象会不断增加所需的堆? (我确实删除了不再使用的对象)。

【问题讨论】:

  • 你不能在 Java 中“删除”对象;无论如何,成为未引用的对象会定期被垃圾收集。这通常发生在其他对象需要内存时,Android 在调度这个方面做得很好
  • 结论:堆大小可以增长以使您的应用程序“感觉舒适”(即快速创建新对象而无需经常运行 GC)——这本身并不是内存泄漏的症状。内存泄漏会突然OutOfMemoryError
  • 谢谢,这帮助我理解了。

标签: java android memory


【解决方案1】:

这取决于垃圾收集如何与您的游戏配合使用。如果您正在创建一堆对象并且它们仍然具有对它们的引用,则 GC 不会清理它们。

您可能只是使用了这么多内存来运行游戏,但您还需要查看对更大对象的引用,看看是否可以更早地销毁它们。

如果你想发疯,你可以做一个堆转储并分析它......jmapjhat 会为你完成。

如果确实是内存泄漏,有 tons 的文章介绍如何调试。

另外,你可以增加你的堆空间。

【讨论】:

    【解决方案2】:

    对于堆空间,您可以扩展XmsXmx 的堆空间大小。

    export JVM_ARGS="-Xms1024m -Xmx1024m"
    

    对于PermGen Space,还可以扩展PermGen Space的PermSizeMaxPermSize

     JVM_ARGS="-XX:PermSize=512M -XX:MaxPermSize=1024m"
    

    您可以按照教程进行操作

    1. http://javarevisited.blogspot.com/2011/05/java-heap-space-memory-size-jvm.html
    2. java.lang.OutOfMemoryError: PermGen space Exception with Eclipse (Spring and Hibernate Application)

    【讨论】:

      【解决方案3】:

      什么是堆空间? - 执行 Java 程序时,JVM 从 RAM 中获取一些内存。 JVM 使用此内存来满足其所有需求,并且此内存的一部分称为 Java 堆空间。每当您使用 new 运算符或任何其他方式创建对象时,都会从堆中为对象分配内存。当对象死亡/垃圾回收时,内存返回堆。

      您可以使用 JVM 选项 -Xms 和 -Xmx 更改堆空间的大小。 Xms 表示 Heap 的起始大小,-Xmx 表示 Heap 的最大大小。

      Java 堆空间分为以下三部分:

      • Young Gen [这个空间由 Eden 空间和 Survivor 空间组成]
      • 老一代
      • 烫发

      垃圾收集过程

      • 在您的程序中创建的所有新对象都会首先分配到 Young Gen 的 Eden Space。一旦伊甸园空间填满,就会触发次要垃圾收集。然后将实时/引用对象移动到第一个幸存者空间。未引用/死对象被删除,伊甸园空间被清除。
      • 在下一次次要 GC 中,伊甸园空间也会发生同样的事情。未引用的对象被删除,被引用的对象被移动到幸存者空间。然而,在这种情况下,它们被移动到第二个幸存者空间(S1)。此外,来自第一个幸存者空间 (S0) 上的最后一次次要 GC 的对象的年龄增加并被移动到 S1。一旦所有幸存的对象都被移动到 S1,S0 和 eden 都将被清除。请注意,我们现在在幸存者空间中有不同年龄的对象。

      • 在下一次次要 GC 中,重复相同的过程。然而,这一次幸存者空间切换。被引用的对象被移动到 S0。幸存的物体会老化。 Eden 和 S1 被清除。

      • Minor GC 后,当老化对象达到一定的年龄阈值(典型场景为 8)时,它们会从年轻代提升到老年代。

      • 随着 Minor GC 的不断发生,对象将继续被提升到老年代空间。

      • 最终,将在老年代执行一次重大 GC,清理并压缩该空间。

      JVM 将 Java 中的堆扩展为接近 -Xmx 指定的最大堆大小,如果没有更多内存用于在 Java 堆中创建新对象,JVM 会抛出 java.lang.OutOfMemoryError 并且您的应用程序会死掉。

      here 用堆空间的图形表示很好地解释了这一点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-31
        • 1970-01-01
        • 2011-01-04
        • 2018-08-30
        • 1970-01-01
        • 2018-05-23
        • 1970-01-01
        相关资源
        最近更新 更多