Восстановление из OutOfMemoryError
, особенно в многопоточной среде, очень сложно, а часто даже невозможно. Вы, вероятно, должны выяснить, почему у вас заканчивается память (например, из-за утечек ссылок или вашему приложению просто нужно больше памяти, чем вы отдали), и попытаться исправить ее, а не пытаться восстановить ее.
Даже если бы вы могли просто позволить потоку, выдавшему ошибку, умереть и перезапустить ее, перезапущенный поток, вероятно, просто умрет снова в самом начале. В более худшем сценарии основная причина может быть в какой-то другой части программы. Это будет означать, что другие потоки в вашем приложении начнут выдавать ту же ошибку, так как они будут пытаться выделить новые объекты, что приведет к каскадной ошибке во всем приложении, и, в конечном итоге, все произойдет потрясающе.
Память не единственная ваша проблема. Состояние вашего приложения может быть почти любым (то есть несовместимым), если поток, завершенный OOME, находился в середине обработки и касался состояния (состояний) некоторых общих объектов, которые также используют другие потоки. Кроме того, если другой поток ожидает какой-либо монитор (мьютекс), который удерживает завершенный поток, или что-то подобное (ожидание / уведомление и т. Д.), Другой поток может оказаться заблокированным. В большинстве случаев написать логику восстановления и проверить, что восстановление прошло успешно, будет очень сложно, поскольку слишком много переменных и вещей нужно проверить, прежде чем можно будет быть уверенным, что приложение действительно ДЕЙСТВИТЕЛЬНО восстановлено.