Как отмечали другие, в идеале вы могли бы избежать этой проблемы с помощью предварительного проектирования и архитектуры программного обеспечения, но я предполагаю, что на данный момент это действительно не вариант.
Как упоминается в другом сообщении, было бы хорошо обернуть логику в некоторые служебные функции, чтобы не писать все время код нехватки памяти.
Чтобы добраться до реальной проблемы, вы пытаетесь использовать общий ресурс, память, но не можете, потому что этот общий ресурс используется другим потоком в системе. В идеале вы хотели бы дождаться, пока один из других потоков в системе освободит необходимый вам ресурс, а затем получить этот ресурс. Если бы у вас был способ перехватить все вызовы выделения и освобождения, вы могли бы настроить что-то так, чтобы выделяющий поток блокировался до тех пор, пока память не была доступна, а освобождение сигнализировало выделяющему потоку, когда память была доступна. Но я предполагаю, что это слишком много работы.
Учитывая ограничения, связанные с невозможностью полностью перестроить систему или переписать распределитель памяти, я думаю, что ваше решение является наиболее практичным, если вы (и другие члены вашей команды) понимаете ограничения, и проблемы, которые это вызовет в будущем.
Теперь, чтобы улучшить свой конкретный подход, вы можете измерить рабочие нагрузки, чтобы увидеть, как часто выделяется и освобождается память. Это поможет вам лучше рассчитать интервал повтора.
Во-вторых, вы хотите попробовать увеличить тайм-аут для каждой итерации, чтобы уменьшить нагрузку этого потока на систему.
Наконец, у вас определенно должно быть некоторое время для ошибки / паники, если поток не может продвинуться после некоторого количества итераций. Это позволит вам хотя бы увидеть потенциальный случай живой блокировки, с которым вы можете столкнуться, если все потоки ждут, пока другой поток в системе освободит память. Вы можете просто выбрать количество итераций на основе того, что эмпирически показано для работы, или вы можете стать более умным в этом и отслеживать, сколько потоков застряло в ожидании памяти, и если это закончится паникой всех потоков.
Примечание: это, очевидно, не идеальное решение, и, как упоминалось на других плакатах, для правильного решения проблемы необходим более глобальный взгляд на приложение в целом, но приведенный выше является практическим методом, который должен работа в краткосрочной перспективе.
person
benno
schedule
29.12.2008