从Java集合中删除对象

时间:2009-01-13 16:42:09

标签: java collections

我有一个HashMap(虽然我猜这个问题适用于其他集合)对象。根据我的理解,当文档讨论删除映射时,它将从哈希表中删除条目,即不一定要破坏实际对象。如果对象的唯一剩余引用在此表中,那么对象是否会被垃圾收集?

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

实际删除表中所有条目的最快方法是什么,但也要销毁这些对象。

6 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:2)

请注意WeakHashMap允许您在其中放置对象,并且只要没有对地图外部的键(不是值)的引用,就可以使它们有资格进行垃圾回收 - 地图条目将在消失时消失这一点。

一般情况下,当对象被垃圾收集时,你不应该担心 - JVM决定这一点,并且它比你更了解它的内存需求和可能的延迟。您应该担心的是确保您不再需要的对象符合条件进行垃圾回收。

答案 2 :(得分:2)

  

如果对象的唯一剩余引用在此表中,那么对象是否会被垃圾收集?

如果没有其他对象的引用,那么该对象将来会被垃圾收集。

您不应该强制销毁对象。如果它们是非常重量级的对象(或者你有太多的对象无法容纳在内存中),这就会导致你的代码出现更基本的问题。

如果你真的必须,那么你可以致电System.gc(),虽然这不是一个好的做法,并且永远是你代码中潜在问题的领头羊。

答案 3 :(得分:2)

一般来说,您无法完全控制对象的具体销毁时间。当没有更多(强烈)引用它时,任何对象都有资格进行垃圾收集 - 但是不能保证什么时候它会被垃圾收集,或者事实上它是否会被垃圾收集。即使调用System.gc()Runtime.gc()也无法保证实际执行任何操作,它只是对JVM的暗示,它现在可能要考虑垃圾收集。我相信你得到的唯一保证是,如果抛出OutOfMemoryError,所有潜在的垃圾收集都会在抛出错误之前完成。

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

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

答案 4 :(得分:1)

要真正收集垃圾,可能没有对该对象的强引用。 weakReference's的对象可能为garbage collected。使用WeakHashMap确保它们被垃圾收集,因为在HashMap中仍然有对该对象的引用。

答案 5 :(得分:0)

您可以在清理地图后发起对System.gc()的调用,但这通常不是一个好主意。