unidirectional=true

Модераторы: kdv, CyberMax

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 19 дек 2006, 15:35

Ладно, флудер, ты хотя бы нашел кто именно и на какой операции кидает эту ошибку? Firebird, IBX, fbclient?

aaa3d
Сообщения: 69
Зарегистрирован: 23 ноя 2005, 11:06

Сообщение aaa3d » 20 дек 2006, 10:41

сталкивался с проблемой "out of memory" два раза. победил и нашел причину (в моем случае). Может, кому и полезно будет.


Возможно путано и не совсем точно, поправьте если надо....
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;
тут есть 2 компонента, желающих выделять память - IBQUERY и RXMEMORYDATA. если любой из них закомментировать - программа будет работать хоть сутки - памяти хватит. если будут работать в паре - упадет за 20 секунд в ошибку (при этом диспетчер задач покажет что памяти еще уйма, свап занят не весь. TaskInfo покажет что программа съела 2 гига виртуальной памяти).
вероятно, это ошибка в менеджере памяти DELPHI, т.к. с использованием постороннего диспетчера проблема ушла.
я использовал LFHeapMemory (просто подключил юнит в самом начале проекта).

Кстати, если уменьшить BufferChunk c умолчания 1000 на 10 то память будет съедаться медленнее.

я так понимаю что фактически занятая память при IBQuery.Close освобождается, а вот виртуальная - нет (или не вся). причем проявляется если идет попеременное выделение памяти разными датасетами.
Последний раз редактировалось aaa3d 20 дек 2006, 13:37, всего редактировалось 1 раз.

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Сообщение hvlad » 20 дек 2006, 13:16

aaa3d писал(а):1.Windows при выделении памяти программой просто помечает что
программе потребуется чтолько то памяти, а физически выделяет только при обращениях к выделенному участку.
Смотря как выделять память. Если просить виртуальную (VirtualAlloc), то да - физически она выделится (commit) только при обращении
aaa3d писал(а):в диспетчере задач отображается только фактически занятая память.
А если таки заглянуть в список колонок ?
aaa3d писал(а):Есть такая программа - TaskInfo - показывает еще Virtual memory - это как раз то что программа запросила своими alloc'ами, так что в ней все видно.
Диспетчер задач это может
aaa3d писал(а):2. если склероз не изменяет то адресное пространство программы в windows ограничено 2 гигабайтаи
При обычной установке - да 2Г.

aaa3d
Сообщения: 69
Зарегистрирован: 23 ноя 2005, 11:06

Сообщение aaa3d » 20 дек 2006, 13:23

hvlad писал(а):
aaa3d писал(а):в диспетчере задач отображается только фактически занятая память.
А если таки заглянуть в список колонок ?

aaa3d писал(а):Есть такая программа - TaskInfo - показывает еще Virtual memory - это как раз то что программа запросила своими alloc'ами, так что в ней все видно.
Диспетчер задач это может
ну не знаю.... у меня XP SP2, в диспетчере есть колонка Виртуальная память, но она ну никак не то показывает про что я говорю. научи если я не прав

Ответить