我想在HashSet中处理一些新数据,不需要任何旧数据或旧的HashSet对象。旧的HashSet对象未在别处引用。
简单地执行hashset = new HashSet<String>()
并让JVM释放旧HashSet对象的内存或者我应该调用hashSet.clear()
并重用相同的HashSet更好吗?
根据openJDK,hashSet.clear()是:
public void clear() {
map.clear();
}
和map.clear():
public void clear() {
modCount++;
Entry[] tab = table;
for (int i = 0; i < tab.length; i++)
tab[i] = null;
size = 0;
}
由于map.clear()会迭代所有条目,所以当hashSet很大时会很费时吗?在这种情况下推荐使用哪一个,构造函数方法或clear()方法?
答案 0 :(得分:6)
简单地不再引用你的HashSet
并让垃圾收集器完成工作。
在解除引用之前清除HashSet
不会更快地释放内存。
答案 1 :(得分:4)
清除HashSet是不必要的 - 只需删除对HashSet的所有引用(如果你编写hashset = new HashSet<>();
就会发生这种情况,假设在其他地方没有引用旧的HashSet),垃圾收集器将完成其余的工作。
另请注意,假设您需要一个大小相同的新HashSet calling hashset.clear()
takes more time than simply creating a new one with the appropriate capacity
答案 2 :(得分:3)
我认为这里有一种误解。你不能手动释放java中的内存。即使您致电System.gc();
,也不能保证GC将在那一刻运行。
关于你的问题:我认为你应该在尽可能小的范围内使用你的引用,当代码离开Set
范围时,对它的引用就会被删除,GC会收集它。
clear();
我认为如果您对Set
有一些进一步的工作,建议使用:例如,如果您处理了其中的数据,并且您准备在其中添加其他数据。< / p>
在实践中,我几乎从来没有看到明确的mySet = null;
(如果你想要显式解引用,那么你应该使用它,因为mySet = new HashSet<>()
没有任何意义)语句,因为它是使用适当的范围要容易得多,也不那么麻烦。
答案 3 :(得分:2)
在java中释放内存是不可能的。你所能做的就是让虚拟机知道如果它想要的话可以免费使用它。当事情超出范围时,这通常会发生。一般来说,不用担心它是可以的。如果您已经分析了应用程序,并且发现了内存泄漏,那么您可以尝试找到它。
绝对不要制作新的HashSet。 clear()将从HashSet中删除所有项目,但是在它超出范围之前仍然不会被收集。
答案 4 :(得分:0)
如果您没有对对象的任何引用,垃圾收集器会自动删除它们。您无需手动执行此操作。
答案 5 :(得分:0)
这取决于,如果您的地图非常小,那么在这种情况下,清除将比生成对象更好。
如果你的地图中有很多物品,那么它甚至不值得清除。就像您看到clear()
方法的实现一样,它遍历所有元素。在这种情况下,创建新对象会更便宜。
但通常最好让垃圾收集器处理清理事务,然后继续创建新对象,而垃圾收集器将清除左侧引用。
但是根据经验,应该尝试限制正在创建的对象的数量。 正如我所说的那样。
答案 6 :(得分:0)
内存管理由JVM自己完成。因此,即使您手动释放内存,也不会自动进行垃圾收集。
垃圾收集器减少了有关内存管理的编码工作。