2010-06-04 82 views

回答

46

停止引用它。

+6

它带来了我的笑脸:) – BalusC 2010-06-04 12:54:02

+24

Java对象==生存危机“如果没有人引用我,我还存在吗?” – 2010-06-04 13:01:46

+0

单独留下所有可怜的记忆片段。停止引用它们。现在:) – schnaader 2010-06-04 15:23:14

6

删除对该字节数组的所有引用。垃圾收集器将负责其余部分。

13

当创建Java中的一个新的byte [],你这样做

byte[] myArray = new byte[54]; 

释放它,你应该做的

myArray = null; 

如果别的引用您的字节数组,像

yourArray = myArray; 

您还需要将其他引用设置为null,如

yourArray = null; 

在Java垃圾收集是自动的。如果JVM可以检测到整个程序不再能够访问一段内存,那么JVM将为您释放内存。

+2

当感觉像JVM时,JVM将释放内存。作为几乎所有java程序的一阶近似,不要担心内存,不要担心,JVM会得到回报。 – 2010-06-04 13:10:56

+4

通常,您不需要将引用设置为null以允许收集对象。如果你需要这样做,你的实现恕我直言,很可能是一个严重的问题。 – 2010-06-04 14:49:36

+3

@彼得:取决于。如果你知道这个变量会比它所指的数组活得长得多,那么明确地设置它是有意义的。虽然这很少见。 – 2010-06-04 15:24:43

1

将所有对它的引用设置为null将使它成为Java自动垃圾收集的候选对象。你不能确定这需要多长时间才能发生。如果您确实需要立即明确回收内存,您可以拨打电话System.gc();

此外,只是要清除您可能不需要显式地将引用设置为空。如果引用超出范围,它们将自动被清空,例如一旦声明的方法执行完成,局部变量引用将被清零。因此,局部变量通常在应用程序运行时期间隐式释放。

+3

System.gc()不立即回收内存。你只是告诉JVM“请,如果你喜欢它,也许你可以清理东西。”这只是一个建议。 – 2010-06-04 15:22:02

+3

System.gc()不会强制GC。这仅仅是一个建议。这就像你的室友之间的差异,“老兄,这个地方是一个残骸,怎么了?”和你妈妈说“清理这个瞬间!”在大多数实现中,System.gc()仅仅是你的室友。 – 2010-06-04 15:23:15

+0

@Jonathon @Jim我没有意识到这一点。 javadocs说:“运行垃圾收集器,调用gc方法表明Java虚拟机花费大量的工作来回收未使用的对象,以便使它们当前占用的内存可以快速重用,当控制从方法调用返回时,Java虚拟机机器尽最大努力从所有丢弃的物体中回收空间。“并以我的称呼它似乎立即运行的经验,但也许我错了 – Alb 2010-06-04 15:44:29