在线程完成后何时释放在线程上分配的对象?

时间:2017-11-15 22:03:44

标签: java multithreading memory javafx memory-leaks

在此代码中

    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千兆内存应该是免费的! 但它不会!

永远不会!!

我该如何取回记忆?

3 个答案:

答案 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会在抛出该错误之前运行垃圾收集器来释放一些内存。希望这有帮助