Я написал одну тестовую программу на сервере Solaris sparc и скомпилировал ее с помощью Sun Studio
#include <iostream>
using namespace std;
int main()
{
const int size = 9999;
char *ptr[size];
while(1)
{
for(int i = 0; i < size; i++)
{
ptr[i] = new char[2048];
}
for(int i = 0; i < size; i++)
{
delete[] ptr[i];
}
}
return 9;
}
compiled it as
CC -m64 -g
Теперь, когда я запускаю его, я вижу, что размер процесса продолжает увеличиваться и процесс падает, когда он достигает предела системной памяти. Я проследил это, используя ферму, и я вижу только системные вызовы brk.
При поиске на некоторых сайтах оракула я устанавливал LD_PRELOAD = libmapmalloc.so, а затем размер процесса был постоянным. truss показывает, что на этот раз он использовал malloc для отображения анонимных страниц памяти.
С другой стороны, я пытался увидеть это поведение на RHEL Linux 2.6 x86 box, и там тоже использовалась ферма, но размер процесса был постоянным.
Я не понимаю поведение или Solaris в первом случае, когда он использует brk для увеличения размера сегмента данных, но когда я делал удаление, он не уменьшал его. Может кто-нибудь объяснить мне, почему солярис делает так?
Так что отличается от того, что Linux делает здесь, чтобы поддерживать постоянный размер процесса, поскольку он также использует тот же системный вызов.
Спасибо
Нирадж Рати
Позвольте мне процитировать официальные документы оракула:
Обратите внимание, что после выполнения free () освободившееся пространство становится доступным для дальнейшего распределения приложением и не возвращается в систему. Память возвращается в систему только после завершения работы приложения.
Я читал эту статью, но, как вы можете видеть, моя схема распределения почти постоянна, я выделяю около 20 МБ памяти, затем освобождаю ее, а затем снова выделяю 20 МБ памяти.
Таким образом, в случае, если Solaris libc повторно использует освобожденную память, он не должен снова и снова вызывать brk, а размер процесса должен оставаться постоянным, но при этом он постоянно растет и кажется, что освобожденная память никогда не используется повторно.
Спасибо
Нирадж Рати