Примечание: Я знаю вопрос Управление памятью в приложении с интенсивной памятью, однако этот вопрос, похоже, касается приложений, которые часто встречаются в то время как мой вопрос касается приложений, предназначенных для того, чтобы потреблять столько физической памяти, сколько безопасно.
У меня есть серверное приложение, которое использует большие объемы памяти для выполнения кэширования и других оптимизаций (думаю, SQL Server). Приложение работает на выделенной машине и поэтому может (и должно) потреблять столько памяти, сколько захочет/может, чтобы ускорить и увеличить пропускную способность и время отклика, не опасаясь воздействовать на другие приложения в системе.
Проблема заключается в том, что если использование памяти недооценивается или если загрузка увеличивается, то это может привести к неприятным сбоям по мере сбоя памяти - в этой ситуации, очевидно, лучше всего сделать это, чтобы освободить память, чтобы предотвратить сбой за счет производительности.
Некоторые предположения:
- Приложение работает на выделенной машине
- Требования к памяти приложения превышают физическую память на компьютере (то есть, если дополнительная память была доступна для приложения, она всегда сможет использовать эту память, чтобы каким-то образом улучшить время отклика или пропускную способность)
- Управление памятью эффективно управляется таким образом, что фрагментация памяти не является проблемой.
- Приложение знает, какая память может быть безопасно освобождена, и какая память должна быть освобождена сначала для наименьшего влияния на производительность.
- Приложение работает на компьютере под управлением Windows
Мой вопрос - как я должен обрабатывать выделения памяти в таком приложении? В частности:
- Как я могу предсказать, не произойдет ли распределение памяти?
- Должен ли я оставить определенный объем свободной памяти, чтобы гарантировать, что операционные системы ОС остаются отзывчивыми (и не так негативно влияют на производительность приложений), и как я могу узнать, сколько памяти есть?
Основной задачей является предотвратить сбои в результате использования слишком большого объема памяти, в то же время используя как можно больше памяти.
Я разработчик С#, однако я надеюсь, что базовые понятия для любого такого приложения одинаковы независимо от языка.