从Java集合中删除对象

从Java集合中删除对象,java,collections,Java,Collections,我有一个对象的HashMap(尽管我想这个问题也适用于其他集合)。据我所知,当文档谈到删除映射时,它就是从哈希表中删除条目,也就是说,不一定要销毁实际对象。如果该对象的唯一剩余引用在此表中,那么该对象是否会被垃圾回收 如果我执行map.clear(),并且表中的那些对象没有在其他地方引用,它们会被垃圾收集吗 最快的方法是,从表中删除所有条目,同时销毁这些对象 是,如果集合是最后一个引用这些对象的位置,则从集合中删除这些对象后,它们有资格进行垃圾收集。不,你不能强行摧毁这些物体。垃圾收集器会在需要

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

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


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

是,如果集合是最后一个引用这些对象的位置,则从集合中删除这些对象后,它们有资格进行垃圾收集。不,你不能强行摧毁这些物体。垃圾收集器会在需要时处理它们。

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

注意,这允许您在其中放置对象,并在不再引用键(而不是值)时使其符合垃圾收集的条件在地图之外-地图条目将在此点消失

一般来说,您不应该担心对象何时被垃圾收集——JVM决定了这一点,它比您更了解其内存需求和可能的延迟。您应该担心的是确保不再需要的对象符合垃圾收集的条件

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

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

您不应该强制销毁对象。如果它们是非常重的对象(或者您有太多的对象无法放入内存),这就指向了代码的一个更根本的问题


如果确实需要,则可以调用
System.gc()
,尽管这不是一种好的做法,并且始终是代码中潜在问题的前兆。

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

一般来说,您无法很好地控制对象何时被专门销毁。当没有更多的(强)引用时,任何对象都有资格进行垃圾收集,但不能保证何时对其进行垃圾收集,或者实际上是否会进行垃圾收集。甚至调用或不保证实际做任何事情,这只是对JVM的一种暗示,现在它可能想考虑垃圾收集。我相信您得到的唯一保证是,如果抛出OutOfMemoryError,所有可能的垃圾收集都是在抛出错误之前完成的

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


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

-1表示System.gc(),+1表示这不是一个好主意。:)你是说“有资格”进行垃圾收集吗?:)MetroidFan2002,我们不支持蜜蜂会拼写好吧,whaddayaknow:实际上我已经把“egligible”作为正确的拼写固定在我的脑海中了——谢谢!覆盖日期并不保证它不再在数据中。JVM经常移动数据,因此旧值可能仍然存在。更糟糕的交换或休眠可能会将其留在光盘上,即使您的计算机已多次重新启动。嗯,说得对。这至少意味着您可以通过编程方式删除变量,即使操作系统可能仍保留该变量的副本/缓存(在您将内存标记为敏感之前,无论采用何种技术,这都是不可避免的)。至少这样你的密码就不会被拘留了。