Aug*_*ste 8 java multithreading
我需要执行大量任务multithreading.
我使用ExecutorService提交许多Callable objects,每个Callable object包含resource执行所需的一些.
问题
这些任务太多了,Callable objects提交ExecutorService占用太多内存然后heap就筋疲力尽了.
我想知道,什么时候JVM释放这些空间Callable objects?
任务完成后是否立即执行此操作,如何管理用于的内存ExecutorService?
我想控制提交ExecutorService,例如,当内存不足然后阻止提交util完成一些任务和空闲空间.可以吗?
整个代码太复杂,我将附加我的代码的主框架.
public class MyCallable implements Callable<Result> {
... // Some members
public MyCallable(...) {
...
}
@Override
public Result call() throws Exception {
... // Doing the task
}
}
class MyFutureTask extends FutureTask<Result> {
... // Some members
public MyFutureTask(...) {
super(new MyCallable(...));
}
@Override
public void done() {
Result result = get();
... // Something to do immediately after the task is done
}
}
// Here is the code to add tasks
ExecutorService executor = Executors.newFixedThreadPool(threadPoolSize);
while (...) {
... // Reading some data from files
executor.submit(new MatchFutureTask(...));
}
executor.shutdown();
Run Code Online (Sandbox Code Playgroud)
如果您正在使用ExecutorService,则必须将BlockingQueue传递给构造函数,对吧?我假设您正在使用ThreadPoolExecutor.使用具有固定容量的ArrayBlockingQueue,并将ThreadPoolExecutor.CallerRunsPolicy传递给ThreadPoolExecutor构造函数.如果将maximumPoolSize设置为某个合理的值,这将相当有效地限制您的提交率.
为了回答您的第一个问题,VM将"在"之后的某个时间释放内存,不再有任何对象的引用.如果Callable在状态方面是自包含的,一旦完成执行,VM应该在给出内存不足错误之前对其进行垃圾收集.
该方法Runtime.getRuntime().freeMemory()将告诉您 JVM 有多少可用内存。您可以编写一个ThreadFactory实现,在创建新线程之前检查该值。