【发布时间】:2015-10-21 20:27:36
【问题描述】:
HashMap.clear() 或 ArrayList.clear() 是否释放内存以缩小大小或大小保持不变?
如何使数组列表或哈希映射引用null 被允许用于 gc。
【问题讨论】:
HashMap.clear() 或 ArrayList.clear() 是否释放内存以缩小大小或大小保持不变?
如何使数组列表或哈希映射引用null 被允许用于 gc。
【问题讨论】:
如果你clear() 你的Map 或Collection,那么垃圾收集器可以收集其中包含的对象,只要它们没有在其他地方引用。与删除对Map 或Collection 本身的所有引用相同(通过将其设置为null):例如,只要Map 是唯一“知道”这些引用的对象,删除所有引用到Map 本身将允许垃圾收集器收集Map 以及其中包含的对象(当然,只要它们没有在其他地方引用)。
但是仅仅清除 Map 并不能保证垃圾收集器会真正运行——它只是可以从内存中清除这些对象,如果它运行的话。但通常你不应该担心这一点。所以你很可能不会注意到调用clear() 会直接和立即获得内存,但这只是因为垃圾收集器不会一直运行。
【讨论】:
= new Xxx(); 通常比清除要快。
clear() 显然必须做一些工作。另一方面,我们在这里谈论的是非常琐碎的任务,通常clear() 不应该比new ... 花费更长的时间,至少不足以证明过早优化是合理的,我猜。如果它确实需要更长的时间,人们应该考虑它所做的工作是否真的有用。
调用 clear 将删除集合中的所有元素,如果您没有对集合中对象的其他引用将使它们有资格进行垃圾收集。
将 null 分配给您的收藏将与上述基本相同,但它也会影响您的收藏。如果没有对该集合的进一步引用,它将变得无法访问并且有资格进行垃圾收集。如果您不保留对该集合中对象的其他引用,它们也可能被垃圾回收。
【讨论】: