Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 这会在JVM中被垃圾收集吗?_Java_Memory Leaks_Garbage Collection - Fatal编程技术网

Java 这会在JVM中被垃圾收集吗?

Java 这会在JVM中被垃圾收集吗?,java,memory-leaks,garbage-collection,Java,Memory Leaks,Garbage Collection,我通过计时器每两分钟运行以下代码: object = new CustomObject(this); 可能会创建大量对象,并覆盖大量对象。即使在新创建的对象中使用了对自身的引用,被覆盖的对象是否也会被垃圾回收 我使用的是JDK1.6.0_13 谢谢你的帮助。我们需要知道构造函数内部发生了什么,才能完整地回答这个问题 但一般来说,只要在创建新对象时没有保留对旧对象的引用,它就可以用于垃圾收集,即使在创建新对象的过程中使用旧对象也是如此 例如: class Foo { private St

我通过计时器每两分钟运行以下代码:

object = new CustomObject(this);
可能会创建大量对象,并覆盖大量对象。即使在新创建的对象中使用了对自身的引用,被覆盖的对象是否也会被垃圾回收

我使用的是JDK1.6.0_13


谢谢你的帮助。

我们需要知道构造函数内部发生了什么,才能完整地回答这个问题

但一般来说,只要在创建新对象时没有保留对旧对象的引用,它就可以用于垃圾收集,即使在创建新对象的过程中使用旧对象也是如此

例如:

class Foo {
    private String name;

    Foo() {
        this.name = null;
    }

    Foo(Foo f) {
        this.name = f.name;
    }

    public void setName(String n) {
        this.name = n;
    }

    public Foo spawn() {
        return new Foo(this);
    }
}
在构造新的
Foo
时,这不会保留对旧
Foo
的引用,因此旧的
Foo
可以:

Foo f;

f = new Foo(); // The first Foo
f.setName("Bar");

while (/* some condition */) {
    // Periodically create new ones
    f = f.spawn();
}
而如果
Foo
看起来像这样:

class Foo {
    private Foo parent;

    Foo() {
        this.parent = null;
    }

    Foo(Foo f) {
        this.parent = f;
    }

    public Foo spawn() {
        return new Foo(this);
    }
}

…然后,每个新生成的
Foo
都会引用以前的
Foo
,并且没有一个可用于GC。

没有被覆盖的对象<代码>对象仅绑定到对象的新实例。只要没有对预先存在的实例的额外引用,它就会在某个时刻被GC删除。孩子是否保留对其父母的引用并不重要。一旦无法访问,它将被标记为GC


我猜你在这里指的并不是
java.lang.Object

java使用“标记并清除”垃圾收集器。基本上这意味着:如果您的运行代码可以访问它,那么它就不符合垃圾收集的条件,否则它就是

这取决于您对构造函数中的对象所做的操作。如果在新创建的对象中保留对它的引用,这将阻止垃圾收集器回收内存

下面的例子说明了这一点:

class Inner {
    public Inner() {
            this.ref = null;
    }

    public Inner(Inner ref) {
            this.ref = ref;
    }

    Inner ref;
}

class Test {
    public static void main(String [] args) {
            Inner x = new Inner();

            while(1==1) {
                    x = new Inner(x);
            }
    }
}

在java中,来自“活动”对象的任何可访问对象都将不会成为垃圾收集的候选对象。

谢谢,这会清除垃圾。我不知道保留对活动对象的引用是否会允许对其他对象进行垃圾收集。java已经有一段时间没有使用mark and sweep作为主gc了。它现在使用的是几代人。GC的方法并不重要。java在规范中保证,如果它是可访问的,它就不会被GC’ed,否则它是/(可能是)。@james:方法确实很重要:“可访问”标准只能通过标记和扫描或类似的方法(java使用的)来实现,而不是通过引用计数。