我用Java创建了一个对象,命名为FOO。 FOO包含大量的数据..我不知道对于我已经拉入ram进行操作的十兆字节文本文件。(这只是一个例子)
这显然是一个巨大的空间,我想从内存中释放它。我将FOO设置为NULL。
这会自动释放内存中的空间吗? 要么 加载的文本文件占用的内存是否会存在,直到自动垃圾回收?
答案 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()可能会破坏这种情况,并且可能由于不必要的任务切换而导致性能降低。
或者,您可以考虑一种允许您不将大量数据加载到内存中的方法。如果你可以通过改进你的代码来获得更好的效果。