代码之家  ›  专栏  ›  技术社区  ›  Miles D

从Java集合中移除对象

  •  0
  • Miles D  · 技术社区  · 16 年前

    我有一个 HashMap (尽管我猜这个问题适用于其他集合)的对象。据我所知,当文档谈到删除映射时,它将从哈希表中删除条目,也就是说,不必破坏实际的对象。如果对该对象的唯一剩余引用在该表中,那么该对象将被垃圾收集吗?

    如果我这样做 map.clear() 表中的那些对象在其他地方都没有被引用,它们会被垃圾收集吗?

    最快的方法是从表中删除所有条目,同时销毁这些对象。

    6 回复  |  直到 16 年前
        1
  •  8
  •   Bombe    16 年前

    是的,如果集合是最后一个引用这些对象的位置,则在从集合中移除这些对象后,它们就可以进行垃圾收集。不,你不能强行摧毁这些物体。垃圾收集器会在感觉到的时候处理它们。

        2
  •  2
  •   James Van Huis    16 年前

    如果对该对象的唯一剩余引用在该表中,那么该对象将被垃圾收集吗?

    如果没有其他对象引用,那么将来某个时候将对该对象进行垃圾收集。

    你不应该强迫销毁这些物品。如果它们是非常重的对象(或者您的内存中容纳的对象太多),那么这就指出了您的代码的一个更基本的问题。

    如果你真的必须,那么你可以打电话给 System.gc() 尽管这不是一个好的实践,但它始终是代码中潜在问题的领头羊。

        3
  •  2
  •   Andrzej Doyle    16 年前

    一般来说,当一个对象被特定地销毁时,您没有很强的控制权。当没有对任何对象的(强)引用时,任何对象都有资格进行垃圾收集—但不能保证何时将进行垃圾收集,或者实际上是否将进行垃圾收集。甚至呼叫 System.gc() Runtime.gc() 不保证实际执行任何操作,这只是对JVM的一个提示,它现在可能要考虑垃圾收集。我相信您得到的唯一保证是,如果抛出OutOfMemoryError,那么所有可能的垃圾收集都是在抛出错误之前完成的。

    这里有处理敏感信息(如密码)的含义。由于不能通过编程清除字符串,因此理想情况下您不希望这样存储密码。如果将其存储为字符数组,则可以使用 Arrays.fill(' ') 覆盖密码并保证从那时起它不再驻留在内存中。

    回到主题上——如果对象没有在其他地方被引用,那么这两个操作都将使其符合垃圾收集的条件,这是正确的。collection.clear()实际上是一次删除对集合中所有对象的引用的最快方法。

        4
  •  2
  •   Michael Borgwardt    16 年前

    注意 WeakHashMap 允许您将对象放在其中,并让它们在映射外部不再有对键(而不是值)的引用时可以进行垃圾收集—此时映射条目将消失。

    一般来说,你不应该担心 什么时候? 对象是垃圾收集的——JVM决定了这一点,它比您更了解它的内存需求和可能的延迟。你什么 应该 担心的是确保你不再需要的物品是 合格的 用于垃圾收集。

        5
  •  1
  •   WolfmanDragon    16 年前

    要收集真正的垃圾,不能有对对象的强引用。对象与 weakReference's 可能是 garbage collected . 使用weakhashmap确保它们被垃圾收集,因为在hashmap中仍然存在对对象的引用。

        6
  •  0
  •   Omry Yadan    16 年前

    您可以在清除映射后启动对System.gc()的调用,但这通常不是一个好主意。