【问题标题】:Does running remove(int index) method on a list to remove object instance invoke garbage collection?在列表上运行 remove(int index) 方法来删​​除对象实例会调用垃圾回收吗?
【发布时间】:2015-10-21 18:16:52
【问题描述】:

我正在 Android 上编写一个应用程序 - 其中一部分涉及屏幕上的一些敌人。这些都包含在一个 ArrayList 中。 我的代码确定 Enemy 类的实例是否在屏幕之外。如果是这样,那么它需要删除对象的实例以保留资源,因为这些资源可以以相当高的速率产生。我目前调用

remove(int index) 

从列表中删除元素的方法。这也会对元素进行垃圾收集吗?如果没有,我如何确保垃圾收集(或者不值得?)

【问题讨论】:

  • 不值得。 Android 会为你调用 GC。
  • 被移除的对象最终会被垃圾回收;何时或如何发生这种情况由 JVM 决定。

标签: java android object arraylist garbage-collection


【解决方案1】:

如果是这样,则需要删除对象的实例以保留资源,因为这些资源可以以相当高的速率产生

更有可能,它需要维护这些对象的object pool,以“保留资源”,如果“这些可以以相当高的速率产生”。

这是否也会对元素进行垃圾收集?

没有。垃圾收集通常是异步执行的。一旦您不再引用某个对象,它将有资格进行垃圾回收,但删除引用不会导致垃圾回收。

如果没有,如何确保垃圾回收

你没有。

【讨论】:

  • 很高兴您提到了对象池模式。如果游戏简单到你只需要生成敌人并给它们 x、y、deltaX、deltaY 值并让它们离开屏幕,那么只需重置 x、y 和(可选)重新处理这些 delta 就可以解决问题。
  • @mafagafogigante:同意。正是因为这个原因,对象池在游戏开发中很受欢迎。 Android 在其他领域也使用它们(例如,SensorEvent 对象被池化)。
  • 我其实很喜欢这个对象池的想法。一定要实现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多