Как уже упоминалось, в идеале, вы избежали бы этой проблемы дизайн и программную архитектуру, но я предполагаю, что на данный момент это действительно не вариант.
Как уже упоминалось в другом сообщении, было бы неплохо обернуть логику в некоторых служебных функциях, чтобы вы не записывали код из памяти на все место.
Чтобы решить настоящую проблему, вы пытаетесь использовать общий ресурс, память, но не можете, потому что этот общий ресурс используется другим потоком в системе. В идеале вам нужно подождать, пока один из других потоков в системе освободит необходимый вам ресурс, а затем приобретет этот ресурс. Если у вас был способ перехватить все выделение и бесплатные звонки, вы могли бы настроить что-то, чтобы выделение потока было заблокировано до тех пор, пока память не была доступна, а освобождение сигнализировало выделение потока при наличии памяти. Но я собираюсь предположить, что это просто слишком много работы.
Учитывая трудности, связанные с невозможностью полностью перепроектировать систему или переписать распределитель памяти, я думаю, что ваше решение является наиболее практичным, если вы (и другие в своей команде) понять ограничения и проблемы, которые он вызовет по пути.
Теперь, чтобы улучшить ваш конкретный подход, вы можете измерить рабочую нагрузку, чтобы увидеть, как часто выделяется и освобождается память. Это дало бы вам возможность рассчитывать, какой интервал повторения должен быть.
Во-вторых, вам нужно попытаться увеличить тайм-аут для каждой итерации, чтобы уменьшить нагрузку на этот поток в системе.
Наконец, у вас определенно должно быть какое-то время ошибки/случая паники, если поток не может добиться прогресса после некоторого количества итераций. Это позволит вам, по крайней мере, увидеть потенциальный случай блокировки в реальном времени, с которым вы можете столкнуться, если все потоки ожидают, что другой поток в системе освободит память. Вы могли бы просто выбрать несколько итераций на основе того, что эмпирически показано на работе, или вы могли бы получить умнее об этом и следить за тем, сколько потоков застряло в ожидании памяти, и если это закончится тем, что все потоки паники.
Примечание: Это, очевидно, не идеальное решение, и, как утверждают другие плакаты, для решения проблемы требуется более глобальный вид приложения в целом, но вышеприведенное является практическим методом, который должен работать в краткосрочной перспективе.
Проблема в том, что около 99% всего кода не имеют понятия, как грамотно обрабатывать неудачные выделения памяти. Приложения терпят неудачу таинственными способами. Никакая свободная память не приводит к остановке практически всех операционных систем. Печально, но верно. – Thorsten79 2008-12-29 09:52:09