在此代码中
new Thread(new Runnable() {
@Override
public void run() {
byte b[] = new byte[1024*1024*1024];
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// just for testing
b = null;
}
},"thread").start();
5秒后1千兆内存应该是免费的!
但它不会!
永远不会!!
我该如何取回记忆?
答案 0 :(得分:4)
简单的答案是最终:不久,不迟。
您无法直接控制何时收集垃圾。如果实例没有对它的引用,垃圾收集器将在某些时候清理它。
答案 1 :(得分:2)
在Java中,你无法明确释放内存。
这取决于JVM垃圾收集器设置。 GC行为有许多参数。
其中一些与一个JVM实现和版本不同。
但是,你不需要关心它。当没有对象的引用时,当GC确定它是时候时,将清理内存。
一般情况下,方法参考内的所有变量都在方法完成时消失,并且可以通过GC清除内存。
您可以建议GC运行:
...
// just for testing
b = null;
System.gc();
但无论如何这是一个暗示。 GC可能运行也可能不运行。
有时像你一样有线
b = null;
不仅适用于测试,也不是常见的情况。
您可以尝试在JVM参数上操作GC设置,以使GC更具侵略性,以避免常常运行GC。
Internet上有大量资源作为Oracle JVM的示例: Java Platform, Standard Edition HotSpot Virtual Machine Garbage Collection Tuning Guide
请记住:不同的JVM可能有不同的GC参数。
答案 2 :(得分:1)
没有直接的方法来释放java中的内存。 GC将运行并处理此问题。如果你认为你会得到outofmemoryexception,那么请注意,java会在抛出该错误之前运行垃圾收集器来释放一些内存。希望这有帮助