Java中的数组和垃圾收集

时间:2016-06-26 10:29:57

标签: java garbage-collection

我们假设我有一个数组a,其中数组的类型为T。将元素设置为null会将其标记为垃圾回收。

例如,如果我执行a[36] = null,或者我还需要更多内容,例如还要将T类型的对象中的字段设置为null

2 个答案:

答案 0 :(得分:2)

在Java中,对象存储在堆上,而变量/引用存储在堆栈中。 GC执行所谓的“循环”,它检查哪些变量不再引用实际数据类型,以及检查范围内是否仍引用了对象。正如马里奥所提到的,当没有任何对象引用它时,最终会收集一个对象,但是在一些性能/内存关键应用程序中,将对象设置为null并尝试加速垃圾收集过程已知可以提供边际性能优势。在这种情况下,我不会太担心它。

答案 1 :(得分:1)

正如其他人所说,没有代码就很难说清楚。但是,这可能会有所帮助:

根据Josh Bloch的 Effective Java 2nd Edition 第2章第6项,您需要将引用设置为null,以使其成为GC' d 如果您管理自己的内存。他解释说,如果您没有null引用它可能会成为过时的引用,这些可能会导致OutOfMemoryError

他给出的例子如下(我缩短了它)。考虑一个堆栈实现,您可以在其中推送和弹出对象。问题出现在pop操作中:

public class Stack {

    private Object[] elements;
    private int size = 0;

    public Object pop() {
        if (size == 0)
            throw new EmptyStackException();
        Object result = elements[--size];
        elements[size] = null; // Eliminate obsolete reference, or you'll have a "memory leak"
        return result;
    }

请注意,您使用size变量手动控制分配的大小,GC无法知道哪些元素已分配,哪些元素是免费的。

如果您发现相关信息,请继续阅读本书中的该部分以获取更多信息。你的案子与我写的有相似之处,但我们无法在没有代码的情况下确定。