unidirectional=true
-
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05
сталкивался с проблемой "out of memory" два раза. победил и нашел причину (в моем случае). Может, кому и полезно будет.
Возможно путано и не совсем точно, поправьте если надо....
1.
Windows при выделении памяти программой просто помечает что
программе потребуется чтолько то памяти, а физически выделяет только при обращениях к выделенному участку.
в диспетчере задач отображается только фактически занятая память.
Есть такая программа - TaskInfo - показывает еще Virtual memory - это как раз то что программа запросила своими alloc'ами, так что в ней все видно.
2. если склероз не изменяет то адресное пространство программы в windows ограничено 2 гигабайтаи. причем это не фактически занятая память а та которая запрошена вызовами alloc.
3. собственно, как я на DELPI делал outOfMemory.
тут есть 2 компонента, желающих выделять память - IBQUERY и RXMEMORYDATA. если любой из них закомментировать - программа будет работать хоть сутки - памяти хватит. если будут работать в паре - упадет за 20 секунд в ошибку (при этом диспетчер задач покажет что памяти еще уйма, свап занят не весь. TaskInfo покажет что программа съела 2 гига виртуальной памяти).
вероятно, это ошибка в менеджере памяти DELPHI, т.к. с использованием постороннего диспетчера проблема ушла.
я использовал LFHeapMemory (просто подключил юнит в самом начале проекта).
Кстати, если уменьшить BufferChunk c умолчания 1000 на 10 то память будет съедаться медленнее.
я так понимаю что фактически занятая память при IBQuery.Close освобождается, а вот виртуальная - нет (или не вся). причем проявляется если идет попеременное выделение памяти разными датасетами.
Возможно путано и не совсем точно, поправьте если надо....
1.
Windows при выделении памяти программой просто помечает что
программе потребуется чтолько то памяти, а физически выделяет только при обращениях к выделенному участку.
в диспетчере задач отображается только фактически занятая память.
Есть такая программа - TaskInfo - показывает еще Virtual memory - это как раз то что программа запросила своими alloc'ами, так что в ней все видно.
2. если склероз не изменяет то адресное пространство программы в windows ограничено 2 гигабайтаи. причем это не фактически занятая память а та которая запрошена вызовами alloc.
3. собственно, как я на DELPI делал outOfMemory.
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var n: integer;
begin
ibdatabase1.Connected:=true;
RxMemoryData1.Open;
n:=0;
button2.Tag:=0;
while button2.Tag=0 do
begin
ibquery1.SQL.Text:='select * from shop'; //таблица с 20 записями
ibquery1.Open;
RxMemoryData1.Insert;
RxMemoryData1.FieldByName('int_field').asinteger:=n;
RxMemoryData1.Post;
ibquery1.Close;
inc(n);
Edit1.Text:=inttostr(n);
Application.processMessages;
end;
end;
вероятно, это ошибка в менеджере памяти DELPHI, т.к. с использованием постороннего диспетчера проблема ушла.
я использовал LFHeapMemory (просто подключил юнит в самом начале проекта).
Кстати, если уменьшить BufferChunk c умолчания 1000 на 10 то память будет съедаться медленнее.
я так понимаю что фактически занятая память при IBQuery.Close освобождается, а вот виртуальная - нет (или не вся). причем проявляется если идет попеременное выделение памяти разными датасетами.
Последний раз редактировалось aaa3d 20 дек 2006, 13:37, всего редактировалось 1 раз.
Смотря как выделять память. Если просить виртуальную (VirtualAlloc), то да - физически она выделится (commit) только при обращенииaaa3d писал(а):1.Windows при выделении памяти программой просто помечает что
программе потребуется чтолько то памяти, а физически выделяет только при обращениях к выделенному участку.
А если таки заглянуть в список колонок ?aaa3d писал(а):в диспетчере задач отображается только фактически занятая память.
Диспетчер задач это можетaaa3d писал(а):Есть такая программа - TaskInfo - показывает еще Virtual memory - это как раз то что программа запросила своими alloc'ами, так что в ней все видно.
При обычной установке - да 2Г.aaa3d писал(а):2. если склероз не изменяет то адресное пространство программы в windows ограничено 2 гигабайтаи
ну не знаю.... у меня XP SP2, в диспетчере есть колонка Виртуальная память, но она ну никак не то показывает про что я говорю. научи если я не правhvlad писал(а):А если таки заглянуть в список колонок ?aaa3d писал(а):в диспетчере задач отображается только фактически занятая память.
Диспетчер задач это можетaaa3d писал(а):Есть такая программа - TaskInfo - показывает еще Virtual memory - это как раз то что программа запросила своими alloc'ами, так что в ней все видно.