1

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

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

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

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

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

4

5 回答 5

4

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

于 2013-04-20T05:25:30.920 回答
1

对于您的第一个示例:

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

在此处输入图像描述

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

在此处输入图像描述

在您的第二个示例中:

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

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

在此处输入图像描述

于 2013-04-20T05:53:10.940 回答
0

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

看这里

于 2013-04-20T05:26:02.093 回答
0
public void example1() {
    byte[] bytes = new byte[100];
}

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

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

这里引用的对象bytes在方法结束后将无法立即进行垃圾回收,example2()因为您正在返回引用。所以,如果你有这样的东西byte[] returnedRef = example2()。然后,即使在从函数调用堆栈中清除returnRef 了局部方法变量之后,该变量也会保留引用。bytes因此,除非returnedRef通过使 1)returnedRef=null或 2)ifreturnedRef是局部变量来分离所持有的引用,否则在returnedRef定义的方法结束时,它将被清除,该对象将不符合垃圾收集的条件。

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

于 2013-04-20T05:31:34.053 回答
0

一般来说,不可能肯定地说一个物体的空间什么时候会“消亡”。即当用于表示它的内存将被回收时。您可以肯定地说:

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

  • 如果对象不可访问,它将在 JVM 到达它必须告诉应用程序它已用完内存的地步之前被回收。

好消息是您无需担心回收何时发生。如果它可以发生,它会在造成麻烦之前发生。

坏消息(有点)是,由于您无法预测何时回收对象,因此编写取决于时间的代码是个坏主意。例如,取决于finalize及时运行的方法。


在您的第一个示例中,当方法返回时,它byte[]资格被垃圾收集。在第二个例子中,我们根本不能说什么。这取决于调用者如何处理返回值。

于 2013-04-20T06:48:31.290 回答