Tengo una gran cantidad de tareas para ejecutar con multithreading
.¿Cómo administrar la memoria cuando se utiliza ExecutorService?
uso el ExecutorService
a presentar un montón de Callable objects
, y cada Callable object
contiene algunos resource
que es necesaria para la ejecución.
Problema
Estas tareas son tantos que la Callable objects
presentado a ExecutorService
ocupan demasiada memoria, entonces el heap
se agota.
Quiero saber, ¿cuándo el JVM
libera el espacio para estos Callable objects
?
¿Hace esto inmediatamente después de que se realiza la tarea y cómo podría administrar la memoria utilizada para ExecutorService
?
Quiero controlar el envío a ExecutorService
, por ejemplo, cuando la memoria no es suficiente, bloquee el envío de algunas tareas completadas y espacio libre. ¿Podría?
El código completo es demasiado complicado, adjuntaré el marco principal de mi código.
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();
una respuesta a su problema se puede dar si se añade un fragmento de código. ¿Qué tipo de servicio ejecutor estás usando? ¿Qué significan muchos (es decir, cuántos son muchos)? –
PD: tengo la sensación de que en realidad estás enfrentando un problema de pérdida de memoria (supongo que en alguna otra parte de tu aplicación tienes referencias a tus Callables) y no un problema de servicio del ejecutor. –
@AlexCalugarescu Uso Executors.newFixedThreadPool() para crear ExecuteService, por lo que debe ser ThreadPoolExecutor. Y los "muchos" significan, el archivo de texto original tiene más de 3GB, lo leo y me encubro a algunos objetos para almacenar en Callables, así que creo que son demasiados. – Auguste