如何在使用ExecutorService时管理内存?

时间:2012-03-01 04:29:17

标签: java multithreading

我需要使用multithreading执行大量任务。

我使用ExecutorService提交了大量Callable objects,每个Callable object都包含了执行所需的resource

问题

这些任务太多,以至于提交给Callable objects的{​​{1}}占用了太多内存,而ExecutorService已耗尽。

我想知道,heap何时释放这些JVM的空间?

任务完成后是否立即执行此操作?如何管理Callable objects使用的内存?

我想控制提交到ExecutorService,例如,当内存不足时,阻止提交util完成一些任务和空闲空间。可以吗?


整个代码太复杂了,我会附上我代码的主框架。

ExecutorService

3 个答案:

答案 0 :(得分:6)

如果你正在使用ExecutorService,你必须将BlockingQueue传递给构造函数,对吗?我假设您正在使用ThreadPoolExecutor。使用具有固定容量的ArrayBlockingQueue,并将ThreadPoolExecutor.CallerRunsPolicy传递给ThreadPoolExecutor构造函数。如果将maximumPoolSize设置为某个合理的值,这将相当有效地限制您的提交率。

要回答您的第一个问题,VM将在“之后的某个时间”释放内存,不再有任何对象的引用。如果Callable在状态方面是自包含的,一旦它完成执行,VM应该在给你一个内存不足错误之前进行垃圾收集。

答案 1 :(得分:3)

方法Runtime.getRuntime().freeMemory()将告诉您JVM有多少可用内存。您可以编写一个ThreadFactory实现,在创建新线程之前检查此值。

答案 2 :(得分:2)

似乎使用Executors.newCachedThreadPool()将内存减少了30% - 60%