在Java中分配null和垃圾回收

时间:2016-02-13 17:13:52

标签: java garbage-collection

假设一个整数向量:

Vector<Integer> v = new Vector<>();
v.add(14);
...
v.add(47);
..

现在我想释放这个Vector的内存。我试图找出以下三个来自垃圾收集视角的陈述之间的区别。

选项1:

v.clear(); /*This will iterate over each object reference contained in v and assign null to it.*/
v = null;

选项2:

v = null;

选项3:

v = new Vector<>(); /*Just to be clear, I understand this statement also assigns a new object to v. :)*/

有意义的是,选项2和3在垃圾收集方面是等价的,但我想确定。任何人都可以帮助解决三者之间的差异吗?

具体地说:如果使用选项2,一切都会被释放,为什么我需要清楚?

2 个答案:

答案 0 :(得分:2)

gc的所有选项都有相同的结果,选项1会节省gc一段时间(当然是以你自己为代价)。因为清除对象引用了所有对象,所以它们不再被引用,甚至在收集第一个对象之前就变成了垃圾。

如果任何对象对它的引用为零,那么它将被gc视为垃圾。 即使两个或多个对象引用了将由gc检测到的彼此。

答案 1 :(得分:2)

Java中不需要显式内存释放。垃圾收集器自动完成。

logging.basicConfig()释放没有引用的内存。 gc()有助于说它已准备好进行垃圾收集。