首页 > 解决方案 > 为什么 ScheduledExecutorService 使用“新”关键字导致内存泄漏

问题描述

当我尝试使用 aScheduledExecutorService执行以下代码时:

ScheduledExecutorService scheduledExecutor = Executors.newScheduledThreadPool(1);
scheduledExecutor.scheduleAtFixedRate(new TaskA(), 0, 1800, TimeUnit.SECONDS);

这会产生内存泄漏(内存使用量不断增长,因此在 12 小时内我在我的机器上使用了 90% 以上的内存(最终导致 Eclipse 由于内存不足而崩溃),即使程序在之后只使用了大约 50% 的内存1-2 次)

但是,当我将其更改为:

ScheduledExecutorService scheduledExecutor = Executors.newScheduledThreadPool(1);

final TaskA taskA = new TaskA();
scheduledExecutor.scheduleAtFixedRate(taskA, 0, 1800, TimeUnit.SECONDS);

似乎释放内存就好了。

为什么第一个代码会导致内存泄漏而第二个不会?线程完成执行后,不是所有的内存垃圾都被收集了吗?

标签: javamemorymemory-leaksheap-memory

解决方案


推荐阅读