Рассмотрите процесс java, в котором основной поток читает объекты Json из источника и назначает задачу с прочитанными объектами Json в FixedThreadPoolExecutor с 5 рабочими потоками.Является ли это хорошей практикой для смягчения OutOfMemoryError?
Здесь проблема в том, что источник, с которого читаются Jsons, намного быстрее, чем завершение задач рабочим потоком. Итак, когда Jsons накапливаются в памяти, ожидающей рабочих потоков, OutOfMemoryException бросается. Здесь количество рабочих потоков не может быть увеличено.
Так будет ли эффективное решение этой проблемы OutOfMemory?
В основном потоке проверить процент доступной памяти и сна в течение некоторого времени, если использование памяти более чем 80%
main(){
for(;;){
//read the data and assign to executor
long total = Runtime.getRuntime().maxMemory(),free = Runtime.getRuntime().freeMemory()
float usedPersent = (total-free)*100/total
if(usedPercent > 80)
Thread.sleep(2000);
}
}
Будет ли хорошая практика?
Не может ли клиент быть заблокирован вместо отказа? –
@MarkoTopolnik - я надеюсь, что так до сих пор расследую. – OldCurmudgeon
Похоже, что «CallerRunsPolicy» - хороший подход. «Это обеспечивает простой механизм управления с обратной связью, который замедлит скорость подачи новых задач». –