Насколько хороша попытка улова при перехвате исключений из памяти?
Он отлично работает на одном уровне ... но на другом уровне он может быть рискованным и/или бесполезным. Смотри ниже.
Возможно ли, что у программы, управляющей памятью, заканчивается память?
«Программа» управляющая память - сборщик мусора. AFAIK, он всегда имеет достаточно памяти для своих целей. Хотя, если бы это было не так, у него не было бы никакой альтернативы, кроме как для жесткой аварии JVM.
Когда я могу попытаться поймать исключение из памяти, и это не уловит исключения?
Только в случае сбоя JVM. Или, если OOME загружается в другой поток стека в тот, где вы пытаетесь его поймать.
ОК, так почему ловите ОКОРОГО рискованного и/или бесполезного.
Первая причина заключается в том, что OOME может быть выброшен в любой стек потока без предупреждения. Когда вы поймаете исключение, обработчик (как правило) не имеет возможности узнать, что происходит с «up stack», и точно, как это произошло. Следовательно, он не знает, было ли повреждено или скомпрометировано состояние выполнения приложения. (Был ли поток посередине обновления чего-то важного? Был ли он уведомлять какой-то другой поток ... и поток теперь не получит уведомление?)
Вторая причина в том, что OOME's часто являются результатом Явная утечка Java ... вызванная чем-то «зависанием» на объектах, когда это не должно делать. Если вы поймаете OOME и попытаетесь возобновить ... когда проблема была вызвана утечкой ... возможно, что оскорбительные объекты по-прежнему будут доступны, а еще один OOME будет следовать довольно скоро. Другими словами, ваше приложение может застрять в состоянии, в котором оно постоянно бросается и восстанавливается от OOME. В лучшем случае это будет убивать производительность ... потому что последнее, что JVM обычно делает до того, как OOME выполняет полную сборку мусора (остановить мир). И это занимает значительное время.
Обратите внимание, что это не означает, что вы никогда не должны ловить OOME. Действительно, ловить OOME, сообщать об этом, а затем закрывать, часто является хорошей стратегией.
Нет, вещь, которая является рискованной/тщетной, заключается в том, чтобы поймать OOME, а затем попытаться восстановить и продолжить работу.
http://stackoverflow.com/questions/1692230/is-it-possible-to-catch-out-of-memory-exception-in-java?rq=1 – NeilA
Это точно так же, как и то, что я спросил, но я хотел бы узнать о конкретных случаях, которые уязвимы для того, чтобы не быть застигнутыми исключениями из памяти изящно. –