我需要使用multithreading
执行大量任务。
我使用ExecutorService
提交了大量Callable objects
,每个Callable object
都包含了执行所需的resource
。
问题
这些任务太多,以至于提交给Callable objects
的{{1}}占用了太多内存,而ExecutorService
已耗尽。
我想知道,heap
何时释放这些JVM
的空间?
任务完成后是否立即执行此操作?如何管理Callable objects
使用的内存?
我想控制提交到ExecutorService
,例如,当内存不足时,阻止提交util完成一些任务和空闲空间。可以吗?
整个代码太复杂了,我会附上我代码的主框架。
ExecutorService
答案 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%