Многие тщательно разработанные фрагменты кода Java были потеряны из-за java.lang.OutOfMemoryError. Кажется, от этого нет никакого облегчения, даже код производственного класса нарушается.
Вопрос, который я хочу задать: есть ли хорошие методы программирования / архитектуры, при которых вы можете избежать этой ошибки.
Итак, инструменты, имеющиеся в распоряжении Java-программистов, выглядят так:
- java.lang.Runtime.addShutdownHook (Перехватчик потока) - перехватчики отключения позволяют плавно упасть.
- java.lang.Runtime.freeMemory () - позволяет нам проверить доступную для виртуальной машины память
Итак, у меня возникла мысль: можно ли написать фабричные методы, которые перед созданием объектов проверяют, достаточно ли в системе осталось памяти, прежде чем пытаться выделить память? Например, в C malloc завершится неудачно, и вы узнаете, что у вас закончилась память, что не идеальная ситуация, но вы не просто упадете замертво от аневризмы java.lang.OutOfMemoryError.
Предлагаемый подход - улучшить управление памятью, устранить утечки памяти или просто выделить больше памяти - я согласен, что это ценные моменты, но давайте рассмотрим следующие сценарии:
- Я использую микро-экземпляр Amazon
- Я могу выделить для моей виртуальной машины очень мало памяти, скажем, 400 МБ
- Мой процесс Java обрабатывает задания в многопоточном режиме, каждый поток потребляет переменный объем памяти в зависимости от параметров вычислительной задачи.
- Предположим, что у моего процесса нет утечек памяти
- Теперь, если я продолжу кормить его работой до того, как она будет завершена, он в конечном итоге умрет от голода памяти.
- Если я установлю -Xmx слишком высоко - я получу подкачку и, возможно, сбой в ОС
- Если я установлю верхний предел одновременных операций - это может быть неоптимально, поскольку я могу ограничить принятие задания, которое может быть выполнено с доступной оперативной памятью, или, что еще хуже, принять задание, требующее МНОГО памяти, и в конечном итоге попадает в java.lang .OutOfMemoryError в любом случае. X. Надеюсь, что это поможет объяснить мотивацию вопроса - я думаю, что стандартные ответы не исключают друг друга в поисках отказоустойчивого подхода к проблеме.
Заранее спасибо.