【问题标题】:Are primitive types garbage collected in Android?原始类型是否在 Android 中被垃圾收集?
【发布时间】:2010-03-19 02:28:41
【问题描述】:

我知道这可能是一个愚蠢的问题,但我的背景更多是 C++ 和管理我自己的内存。

我目前正在减少我可以从我的一个游戏中进行的每一个分配,以尝试减少垃圾收集的频率和感知的“滞后”,因此对于我创建的每个变量都是一个对象(字符串和矩形示例)我确保在构造函数中先创建它,而不是在简单 10 中创建临时变量 线函数...(我希望这是有道理的)

不管怎样,尽管今晚我还在工作,但我意识到我对垃圾收集的假设可能完全错误,而原始类型(int、boolean、float)是我在 10 行函数中创建的这些原始类型变量被称为 20 每秒增加我的垃圾收集问题?

所以一年前每隔几秒我就会在 logcat 中看到一条消息,例如

GC 释放了 4010 个对象 / 484064 个字节 101毫秒

现在我每隔 15-90 秒左右就会看到一条消息...

所以换个说法:看到此消息时是否包含原始类型(int、float、boolean 等)?

【问题讨论】:

    标签: android garbage-collection dalvik


    【解决方案1】:

    原始类型不是对象,因此它们不会导致任何垃圾回收。但是,您必须非常小心,因为由于装箱,原始类型很容易成为对象,而无需您明确这样做。

    例如,如果你想要一个整数键的 HashMap,你会使用 HashMap。请注意,因为“int”不是对象,所以不能在容器中使用。 Integer 是原始 int 的对象版本。当您编写这样的代码时,会自动为您创建一个 Integer 对象:

    HashMap<Integer, Object> map = new HashMap<Integer, Object>();
    int someNum = 12345;    // no object created.
    map.put(someNum, null); // Integer object created.
    

    请注意,如果您不使用泛型,也会发生完全相同的事情,但更隐蔽:

    HashMap map = new HashMap();
    int someNum = 12345;    // no object created.
    map.put(someNum, null); // Integer object created.
    

    对于这种特殊情况,您可以使用 Android 的 SparseArray 类,它是原始整数键的容器。

    【讨论】:

      【解决方案2】:

      似乎答案是否定的。看起来原语在 Java 中被放在堆栈上而不是在堆中,并且只有对象被垃圾收集。我发现了很多关于这个的简短参考,请查看 Wikipedia。对于一些稍微繁重的阅读,请参阅一篇关于 JVM 垃圾收集实现的论文,该论文更明确地解释了原语存储在物理上独立的内存位置,因此它们不会被错误地包含在垃圾收集中 here。如果您想略读,第 4 页是最直接解释的地方。

      这里是 android 特定线程,说明 gc only scans pointers 以及如何使用 it checks that

      【讨论】:

      • Android 不运行标准的基于堆栈的 JVM,它有自己的基于寄存器的 VM。
      【解决方案3】:

      [注意:我还没有完整的评论权限,所以我将其添加为单独的答案。]

      看起来像基元 Java中的堆栈而不是堆中 只有对象是垃圾 收集。

      这不太准确。原语可以保存在局部变量中,也可以作为类的静态或实例字段。在后一种情况下,它们确实存储在堆上,但重要的是它们没有自己的“生命”,特别是没有与它们所在的对象分开 gc'ed。

      Android 不运行标准 基于堆栈的JVM,它有自己的 基于注册的虚拟机。

      这是一个真实的陈述,但它也有点误导,并且与原始问题的重点无关。事实上,当一个方法调用另一个(等等)时,这些方法的激活帧存储在 Dalvik 实现中的堆栈中。不同之处在于,当孤立地查看激活帧时,Dalvik 激活帧不包含 其中 可变大小堆栈。在这方面,Dalvik 安排激活帧的方式更像是传统的类 C 语言(例如 C 或 C++)的处理方式。

      【讨论】:

      • 等他们拿到 N.P.E.由于在方法调用中的 auto 上没有默认的普通构造函数,因此尝试使用类型擦除作为唯一线索来追踪它 - ope 的基本问题与隐藏的 obj 创建和 G.C.对于“C”风格的编程范式来说,这有点难以管理,在这种范式中,人们可以完成“D”对 ~this 所做的事情......尽管唯一有效的方法是使用同步关键字并重用 obj ref's(这将得到来自已建立的 Java 传统主义者的许多嚎叫)所以 OP 真正需要做的是阅读 Hans-J。 gc.h 中 Boehm 的 cmets
      猜你喜欢
      • 1970-01-01
      • 2013-04-11
      • 2020-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多