Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2009.07.12;
Скачать: [xml.tar.bz2];

Вниз

утечка памяти Getmem+FreeMem   Найти похожие ветки 

 
ford ©   (2009-05-11 21:37) [0]

Доброго времени суток :)
Кто нибудь может объяснить такой вот нонсенс
создаю пустое приложение, только форма и две кнопки
на первой кнопке стоит процедура
procedure TForm1.Button1Click(Sender: TObject);
begin
GetMem(p,10*1024*1024);
end;
на второй
procedure TForm1.Button2Click(Sender: TObject);
begin
freeMem(p);
end;
где p глобальная переменная и описанна как
p:^Byte;

запускаю программу, открываю TaskManager
наблюдаю следующую картину
1.запущено приложение, памяти 2616к
2.мышкой поводил над кнопочками, памяти 2636
3.еще поелозил мышкой по форме, памяти уже 2652
4.переключился на TaskManager памяти уже 2744к
6.нажимаю на первую кнопочку, памяти 2776к
  (я просил 10к, выделило 32к, ну ладно может размер блока такой)
7.нажимаю на вторую кнопочку и освобождаю память, выделенную под Р, в менеджере память занятая приложением 2748к. т.е. освободилось 28672б!!!
7.переключился на таск менеджера, память программы опять увеличлась до 2752к

....
Ну я понимаю еще когда над кнопосками мышкой бегаешь, память увеличивается, ну когда переключаешся, тоже понимаю
но почему при освобождении памяти занятой под указатель
освободилось всего треть???
куда остальную то дели??


 
ford ©   (2009-05-11 21:42) [1]

забыл добавить, если в следующий раз опять нажать на кнопку №1
то память увеличится на 28672б
и при нажатии на кнопку №2
уменьшется на 28672
:)
и так до бесконечности


 
ford ©   (2009-05-11 22:04) [2]

пощел дальше проверять
сделал массив глобальный, указателей, на 10 эл-тов
и на первой кнопочке сделал

procedure TForm1.Button1Click(Sender: TObject);
Var i:Integer;
begin
for i:=1 to 10 do
 GetMem(p[i],10*1024*1024);
end;


на второй

procedure TForm1.Button2Click(Sender: TObject);
Var i:Integer;
begin
For i:=1 to 10 do
 freeMem(p[i]);
end;


:))
при нажатии на первую кнопку
по менеджеру задач, памяти выделилось 300Кб а освободилось, после нажатия на вторую 296 4 кило кудато делись :(((
но черт побери я просил 100к выделить
а выделили 300!!!!
жуть


 
Юрий Зотов ©   (2009-05-11 22:41) [3]

Не обращайте внимания, это не утечка. Менеджер памяти в Delphi выделяет не столько, сколько запрошено, а с запасом; и отдавать всю освободившуюся память тоже не спешит. Сделано это специально, чтобы реже выполнять дорогостоящую операцию запроса памяти.


 
Игорь Шевченко ©   (2009-05-11 22:42) [4]

не надо смотреть на task manager


 
ford ©   (2009-05-11 22:49) [5]


> Юрий Зотов ©   (11.05.09 22:41) [3]

верю что с запасом
но както в три раза больше выделать
:((
я в цикле попросил выделить 100 блоков по 10к
1мб
выделилось 3мб!!
а ежели я попрошу выделить 300к.
выделиться 1Гиг!!!???
так чтоли??


 
ford ©   (2009-05-11 22:54) [6]

или при запросе 100кб
он выделяет 300кб
но если я прпошу при выделенных 100кб
еще 100кб, то он разместит их в этих 300кб или запросит еще 300 у ОС ??


 
ford ©   (2009-05-11 22:58) [7]


> Юрий Зотов ©   (11.05.09 22:41) [3]


> Игорь Шевченко ©   (11.05.09 22:42) [4]

ребята, объясните тогда ошибку OUT of MEMORY
ежели я вот в этом коде нажму на кнопку 1 а потом на кнопку 3


Type TArray=Array[1..10*1024*1024] of Byte;
    pArray=^TArray;
Var p:Array[1..100] of ^Byte;
   p2:Array[1..100] of PArray;

procedure TForm1.Button1Click(Sender: TObject);
Var i:Integer;
begin
for i:=1 to 100 do
 GetMem(p[i],10*1024*1024);
end;

procedure TForm1.Button2Click(Sender: TObject);
Var i:Integer;
begin
For i:=1 to 100 do
 freeMem(p[i]);
end;

procedure TForm1.Button3Click(Sender: TObject);
Var i:Integer;
begin
For i:=1 to 100 do
 New(p2[i]);
end;

procedure TForm1.Button4Click(Sender: TObject);
Var i:Integer;
begin
for i:=1 to 100 do
 Dispose(p2[i]);
end;


решил проверить отличаются выделения памяти для проуедур New и GetMem
нажал на первую, надал на третью и ошибка о нехватке памяти :(((
я в ступоре
ну первый раз метр выделить
и второй раз метр выделить
памяти на компе , честно, хватит 10 раз так выделить :)


 
Игорь Шевченко ©   (2009-05-11 23:01) [8]


> procedure TForm1.Button3Click(Sender: TObject);
> Var i:Integer;
> begin
> For i:=1 to 100 do
>  New(p2[i]);
> end;


Это не метр, это 100*10 метров.


 
ford ©   (2009-05-11 23:12) [9]


> Это не метр, это 100*10 метров.

я тоже думал что это метры
но вот эта штука
GetMem(p[i],10*1024*1024);

выделяет 10к!! (т.е. 32к! )
но не 10 метров!!
во всяком случае так в менеджере задач
и если я нажму на кнопку №3
то в менеджере задач мне отображается что выделено 3Мб!!!
чесслово!! могу скриншот сделать


 
DVM ©   (2009-05-11 23:15) [10]


> ford ©

Используй FastMM4, MemProof и т.д. но не смотри ты в диспетчер задач. На основании его показаний что-либо понять довольно сложно.


 
ford ©   (2009-05-11 23:20) [11]

хорошо, убедили, не буду смотреть в таск менеджер Ж)
но тогда всервано загадка
я прошу выделить вмне два раза по 1 гигу
файл подкачки, аж 2.5 гига
+ оперативка 825м
ну, т.е. должно хватитьто
а оно мне Out of memory


 
DVM ©   (2009-05-11 23:24) [12]


> ford ©   (11.05.09 23:20) [11]


> хорошо, убедили, не буду смотреть в таск менеджер Ж)

Можешь смотреть, только смотри хотя бы столбец Виртуальная память.


> я прошу выделить вмне два раза по 1 гигу


> а оно мне Out of memory

Так и должно быть


 
Юрий Зотов ©   (2009-05-11 23:30) [13]

> ford ©   (11.05.09 23:20) [11]

> я прошу выделить вмне два раза по 1 гигу

Вся память приложения - 4 гига (предел адресации в 32-битной системе).
Из них 2 верхних гига и нижние 64 Кб - зарезервировано.
Часть оставшейся памяти занимает сама программа и стек.

Откуда же взять еще 2 раза по гигу?


 
ford ©   (2009-05-11 23:35) [14]


> Юрий Зотов ©   (11.05.09 23:30) [13]

убедил
интересно тогда ну 64 нижней это я в курсе кому
а кому 2 гига верхней то достались??


 
DVM ©   (2009-05-11 23:45) [15]


> а кому 2 гига верхней то достались??

ОС


 
ford ©   (2009-05-11 23:54) [16]


> DVM ©   (11.05.09 23:45) [15]
>
> > а кому 2 гига верхней то достались??
>
> ОС
> <Цитата>

ууу жадина
:)

вообще, спраишвается, накой тогда вообще свап какойто делать
ежели всего 4 гига памяти
ну сделаи бы безлимитную т.е. ограниченную размером свопа


 
DVM ©   (2009-05-11 23:57) [17]


> ну сделаи бы безлимитную т.е. ограниченную размером свопа

Безлимитную нельзя, у тебя указатели 32-битные. Потому максимум 4Гб.
Если необходимы большие объемы памяти надо переходить в 64 разрядную версию Windows


 
Игорь Шевченко ©   (2009-05-12 00:03) [18]


> то в менеджере задач мне отображается что выделено 3Мб!!
> !


не надо смотреть на task manager

Сколько раз надо повторить, чтобы дошло ?


 
Игорь Шевченко ©   (2009-05-12 00:03) [19]

флудеры маст дай


 
Юрий Зотов ©   (2009-05-12 00:22) [20]

> ford ©   (11.05.09 23:54) [16]

Она не жадина. Ей DLL куда-то грузить надо.


 
ford ©   (2009-05-12 02:00) [21]


> DVM ©   (11.05.09 23:57) [17]

ну погодите, ежели так посмотреть то в ДОСе тоже был лимит на 64к
но сделали ... блин уже забыл как назывались, вощем адресовали как номер блока:смещение в блоке
конечно это возврат к старому, но всетаки зато практически снимается ограничение на память :)

хотя может я и не прав


 
Юрий Зотов ©   (2009-05-12 08:32) [22]

> ford ©   (12.05.09 02:00) [21]

Сегмент (word) : Смещение (word)

Word - потому, что регистры 16-битные. То есть, размер сегмента не может превышать 64К. Это и есть ограничение, о котором Вы говорите.


 
Anatoly Podgoretsky ©   (2009-05-12 09:10) [23]

И ограничено это было 1 мегабайтом.


 
DVM ©   (2009-05-12 11:06) [24]


> ford ©   (12.05.09 02:00) [21]


> конечно это возврат к старому, но всетаки зато практически
> снимается ограничение на память :)

Зачем городить такой огород, когда есть 64 разрядные ОС.


 
AndreyV ©   (2009-05-12 14:19) [25]

> [21] ford ©   (12.05.09 02:00)
> хотя может я и не прав

Наверно архитектуру процессоров 80х86, не знаешь? А уже несколько лет х64 как.:)


 
oldman ©   (2009-05-13 10:41) [26]


> Игорь Шевченко ©   (11.05.09 22:42) [4]
> не надо смотреть на task manager
> Сколько раз надо повторить, чтобы дошло ?


Повторять, повторять, повторять!!!


 
Bel ©   (2009-05-14 16:11) [27]

Аффтар, читай книжки (Рихтера, например) до полного просветления.


 
pasha_golub ©   (2009-05-14 18:53) [28]


> Игорь Шевченко ©   (11.05.09 22:42) [4]
>
> не надо смотреть на task manager

Ага, я клиенту своему чуть горло не перегрыз пока доказал, что нету утечек.



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2009.07.12;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.006 c
2-1243095504
{RASkov}
2009-05-23 20:18
2009.07.12
Построение дерева


2-1242837940
Dr.Andrew
2009-05-20 20:45
2009.07.12
Как строку short *s=(short*)buffer можно перевести на делфи?


3-1220962765
Николай 2
2008-09-09 16:19
2009.07.12
ненадёжность связи и TpFIBDatabase.Execute


2-1243107805
Dot
2009-05-23 23:43
2009.07.12
запись значения из таблицы в переменную


2-1242895540
kyn66
2009-05-21 12:45
2009.07.12
Ошибка в SQL-запросе





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский