为什么可以在Java实例方法完成GC执行之前收集对象?

时间:2016-10-04 05:25:17

标签: java garbage-collection threadpoolexecutor

运行以下代码,可能会出现java.util.concurrent.RejectedExecutionException异常。

/**
 * -Xmx20m -Xms20m
 *
 */
public class SingleThreadPoolTest {

    public static void main(String[] args) {
        for (int i = 0; i < 20000; i++) {
            newSingleThreadPool();
        }
    }

    private static void newSingleThreadPool() {
        // create a SingleThreadExecutor then submit a task to it
        Executors.newSingleThreadExecutor().submit(new Runnable() {
            @Override
            public void run() {
                byte[] bytes = new byte[1024 * 1024 * 4];
                System.out.println(Thread.currentThread().getName());
            }
        });
    }
}

exception

这里的问题是SingleThreadExecutor对象可以被GC收集,它将执行其finalize,以便在实例方法submit完成执行之前关闭线程池。

这似乎违反直觉,会产生错误。 我的问题是,这怎么可能发生?这是GC的正常行为吗?有没有其他语言与GC似乎有问题?

以下是向jdk错误系统报告的错误:Executors.newSingleThreadExecutor().submit(runnable) throws RejectedExecutionException

0 个答案:

没有答案