У меня есть пакетный процесс, который последовательно преобразует WAV в MP3. Проблема состоит в том, что после нескольких тысяч слишком много открытых файлов остается, и оно достигает предела количества файлов.
Причина, по которой это происходит, из-за кода в SystemCommandTasklet:
FutureTask<Integer> systemCommandTask = new FutureTask<Integer>(new Callable<Integer>() {
public Integer call() throws Exception {
Process process = Runtime.getRuntime().exec(command, environmentParams, workingDirectory);
return process.waitFor();
}
});
Это имеет неприятный побочный эффект: я полагаюсь на JVM для очистки процессов, оставляя открытыми файлы и все такое.
Я переписал это так:
FutureTask<Integer> systemCommandTask = new FutureTask<Integer>(new Callable<Integer>() {
public Integer call() throws Exception {
Process process = Runtime.getRuntime().exec(command, environmentParams, workingDirectory);
int status = process.waitFor();
process.getErrorStream().close();
process.getInputStream().close();
process.getOutputStream().flush();
process.getOutputStream().close();
process.destroy();
return status;
}
});
Я на 95% уверен, что это работает на моем Mac (благодаря lsof), но как мне сделать правильный тест, который будет работать на любой системе, чтобы ДОКАЗАТЬ, что то, что я пытаюсь сделать, действительно работает?