从Java集合中删除对象
我有一个对象的HashMap
(尽管我猜这个问题适用于其他集合)。据我所知,当文档谈到删除映射时,它就是从哈希表中删除条目,也就是说,不一定要销毁实际对象。如果该对象的唯一剩余引用在此表中,那么该对象是否会被垃圾回收
如果我执行map.clear()
并且表中的那些对象没有在其他任何地方引用,它们会被垃圾收集吗
最快的方法是,从表中删除所有条目,同时销毁这些对象
你可以在下面搜索框中键入要查询的问题!
我有一个对象的HashMap
(尽管我猜这个问题适用于其他集合)。据我所知,当文档谈到删除映射时,它就是从哈希表中删除条目,也就是说,不一定要销毁实际对象。如果该对象的唯一剩余引用在此表中,那么该对象是否会被垃圾回收
如果我执行map.clear()
并且表中的那些对象没有在其他任何地方引用,它们会被垃圾收集吗
最快的方法是,从表中删除所有条目,同时销毁这些对象
# 1 楼答案
如果没有对对象的其他引用,那么该对象将在将来某个时候被垃圾收集
您不应该强制销毁对象。如果它们是非常重的对象(或者您有太多的对象无法放入内存),这就指向了代码的一个更根本的问题
如果您确实必须这样做,那么您可以调用
System.gc()
,尽管这不是一个好的实践,并且始终是代码中潜在问题的前兆# 2 楼答案
一般来说,你不能很好地控制一个物体何时被破坏。当没有更多的(强)引用时,任何对象都有资格进行垃圾收集,但不能保证何时对其进行垃圾收集,或者实际上是否会进行垃圾收集。甚至调用System.gc()或Runtime.gc()都不能保证实际做任何事情,这只是对JVM的一种暗示,现在它可能想考虑垃圾收集。我相信您得到的唯一保证是,如果抛出OutOfMemoryError,所有可能的垃圾收集都是在抛出错误之前完成的
这里有一些处理敏感信息(如密码)的含义。由于字符串不能通过编程方式清除,理想情况下,您不希望将密码存储为这样。如果改为将其存储为字符数组,则可以使用
Arrays.fill(' ')
覆盖密码,并保证密码从此不再驻留在内存中回到主题——如果对象没有在其他地方被引用,那么这两个操作都会使对象符合垃圾收集的条件,这是对的。收集clear()确实是一次删除对集合中所有对象的引用的最快方法
# 3 楼答案
您可以发起对系统的调用。gc(),但这通常不是一个好主意
# 4 楼答案
请注意,WeakHashMap允许您将对象放置在其中,并在映射之外不再有对键(而不是值)的引用时使它们符合垃圾收集的条件-此时映射条目将消失
一般来说,当对象被垃圾收集时,您不应该担心——JVM决定了这一点,它比您更了解其内存需求和可能的延迟。您应该担心的是确保不再需要的对象有资格进行垃圾收集
# 5 楼答案
要真正地进行垃圾收集,就不能有对对象的强引用。带有weakReference's的对象可以是garbage collected。使用WeakHashMap确保它们是垃圾收集的,因为在HashMap中仍然存在对对象的引用
# 6 楼答案
是的,如果集合是这些对象的最后一个引用位置,则从集合中删除这些对象后,它们有资格进行垃圾收集。不,你不能强行摧毁这些物体。垃圾收集器会在感觉需要时处理它们