从Java集合中删除对象

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

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

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

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

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

如果没有对对象的其他引用,则该对象将在以后的某个时间进行垃圾回收。

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

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

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

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

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

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

一般来说,你不应该担心对象何时被垃圾收集–JVM决定这一点,并且它比你更了解它的内存需求和可能的延迟。 您应该担心的是确保您不再需要的对象有资格进行垃圾回收。

要真正收集垃圾,就不能对该对象进行强引用。 具有weakReference的对象可能被垃圾收集 。 使用WeakHashMap确保它们被垃圾收集,因为在HashMap中仍然存在对该对象的引用。

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