Java的垃圾收集什么时候可以释放内存?

时间:2010-07-23 03:34:42

标签: java garbage-collection

我用Java创建了一个对象,命名为FOO。 FOO包含大量的数据..我不知道对于我已经拉入ram进行操作的十兆字节文本文件。(这只是一个例子)

这显然是一个巨大的空间,我想从内存中释放它。我将FOO设置为NULL。

这会自动释放内存中的空间吗? 要么 加载的文本文件占用的内存是否会存在,直到自动垃圾回收?

6 个答案:

答案 0 :(得分:15)

当您将任何对象的引用设置为null时,它将变为可用以进行垃圾回收。在垃圾收集器实际运行之前,仍占用内存。无法保证GC何时运行,除非在抛出OutOfMemoryException之前肯定会运行并从无法访问的对象中回收内存。

您可以调用System.gc()来请求垃圾回收,但是,这就是请求。 GC可自行决定运行。

在某些情况下,使用WeakReference会有所帮助。请参阅Brian Goetz的this article

答案 1 :(得分:8)

答案 2 :(得分:5)

设置foo = null;并不意味着foo会立即被垃圾收集。相反,它将在GC下次运行时收集,如果可以的话。收集foo时,其拥有唯一参考的任何对象也有资格收集并因此被收集。

答案 3 :(得分:5)

请注意,即使调用System.gc()也不能保证JVM会立即执行此操作。

System.gc()只是一个请求,并不能保证它会立即生效。

答案 4 :(得分:0)

无法保证JVM会立即执行此操作,您可以尝试使用 System.gc()

强制它

答案 5 :(得分:0)

垃圾收集器将在“销毁”引用后释放内存。 i.3将对象引用设置为null。您可以使用强制垃圾收集选项,但您应该小心使用它。垃圾收集器旨在使用优化的调度,因此调用System.gc()可能会破坏这种情况,并且可能由于不必要的任务切换而导致性能降低。

或者,您可以考虑一种允许您不将大量数据加载到内存中的方法。如果你可以通过改进你的代码来获得更好的效果。