在java中,对象空间何时消失,由“new”运算符创建

时间:2013-04-20 05:22:48

标签: java

我编写Java程序,我想用Java中的一些内存管理清楚。 例如,像这样的方法:

 public void example1() {
        byte[] bytes = new byte[100];
    }

调用此方法后,堆空间中“new”创建的byte []空间是否会消失? 第二个例子是这样的:

public byte[] example2() {
       byte[] bytes = new byte[100];
       return bytes
}

还有一个问题,在这种情况下,byte []空间是否会消失?

5 个答案:

答案 0 :(得分:4)

当垃圾收集器运行时,空间被垃圾收集并且它检测到没有更多对它的引用。在这种情况下,如果这是唯一有关的代码,则当方法退出时,引用将不复存在,因此从那时起,空间符合条件进行收集。

答案 1 :(得分:1)

第一个例子:

public void example1() {
        byte[] bytes = new byte[100];
}

enter image description here

当方法退出时,对方法中创建的对象的所有引用都消失了,因此它有资格被垃圾收集器“破坏”。

enter image description here

在你的第二个例子中:

public byte[] example2() {
       byte[] bytes = new byte[100];
       return bytes
}

在这里,您将返回该值。如果您在某处使用该返回值,例如byte[] myByte = example2();,则会保留一个活动引用,因此该对象将无法进行收集。

enter image description here

答案 2 :(得分:0)

你作为Java程序员不能强制Java中的垃圾收集;它只会在JVM认为需要基于Java堆大小的垃圾收集时触发。垃圾收集器运行,它检测到没有更多的引用。

SEE HERE

答案 3 :(得分:0)

public void example1() {
    byte[] bytes = new byte[100];
}

bytes方法完成后,example1()变量引用的对象将有资格进行垃圾回收,因为它是本地变量形式的唯一活动引用{{1将从函数调用堆栈中清除。

bytes

此处public byte[] example2() { byte[] bytes = new byte[100]; return bytes } 引用的对象在bytes方法结束后不能立即进行垃圾回收,因为您将返回引用。所以,如果你有这样的事情example2()。然后,即使在从函数调用堆栈中清除了本地方法变量byte[] returnedRef = example2()之后,引用仍由变量returnRef保持。因此,除非bytes所持有的引用通过使1)returnedRef或2)(如果returnedRef=null是局部变量)分离,然后在方法的末尾{{1定义后,它将被清除,该对象将不符合垃圾回收的条件。

即使某个对象符合垃圾收集条件,也不一定意味着它会被GC销毁。当垃圾收集器运行时最好留给JVM来决定。

答案 4 :(得分:0)

一般来说,当对象的空间“死亡”时,不可能肯定地说;即当用于表示它的存储器将被回收时。你可以肯定地说:

  • 当任何东西仍然可能使用该对象时,该空间将不会被回收;即,它仍然可以

  • 如果对象无法访问,它将在JVM到达必须告诉应用程序内存不足的点之前回收。

    < / LI>

好消息是,当回收发生时,您无需担心。如果它可能发生,它将在它引起麻烦之前发生。

坏消息(某种程度上)是因为您无法预测何时会回收对象,所以编写取决于时间的代码是一个坏主意;例如依靠finalize方法及时运行。


在您的第一个示例中,byte[] 符合条件的在方法返回时进行垃圾回收。在第二个例子中,我们根本不能说什么。这取决于调用者对返回值的处理方式。