У меня следующая проблема: в программе есть ошибка, подобная следующей
int main() {
for(;;) {
char *p = (char*)std::malloc(1024);
std::memset(p, 1, 1024);
}
}
И он продолжает распределять память до тех пор, пока моя система не начнет выгружать страницы других приложений в пользу этой программы, и я больше не могу ничего делать на коробке. Я сталкивался с этой проблемой несколько раз в разных приложениях (сегодня это было с бета-версией Moonlight 2 в Firefox). Я думаю, что проблема в том, что из-за программы происходит обмен памяти другой программы, и поэтому она может использовать больше физической памяти.
Естественно я посмотрел в ulimit, и нашел две настройки
-m
максимальный размер резидентного набора
-v
размере виртуальной памяти
Я прочитал, что первый обозначает общий объем физической памяти, который процесс может использовать одновременно. Мне кажется, что это более разумно, чем общий размер виртуальной памяти, потому что она может использоваться совместно, и это может вообще не иметь никакого значения, потому что она все равно выгружается. Поэтому я добавил следующее в свой .bashrc
посмотрев на обычные размеры резидентных наборов с top
, который варьируется до 120 МБ для обычной сессии Firefox.
# limit usage to 256MB physical memory out of 1GB
ulimit -m 262144
Но после запуска моего вышеупомянутого тестового фрагмента, он все еще отключил мою систему, и мне пришлось ждать около 5 минут, пока терминал не распознал нажатия клавиш ^C
Обычно, если я не реагирую в течение первых нескольких секунд, в этих ситуациях я могу только нажать кнопку сброса, что мне действительно не нравится - так у кого-нибудь есть стратегия, как это решить? Почему не работает физическое ограничение? Мне кажется, что таким образом у других приложений все еще должно быть достаточно физической памяти для разумной реакции.