Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Oberon
Перезагрузить страницу В Компонентном Паскале нет процедуры DISPOSE
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
S.Yu.Gubanov S.Yu.Gubanov вне форума
Member
 
Сообщений: 587
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.12.2002
По умолчанию В Компонентном Паскале нет процедуры DISPOSE - 10.02.2003, 16:34

В Компонентном Паскале нет процедуры DISPOSE(), вместо нее работает сборщик мусора. В том что сборщик мусора действительно работает можно убедится с помощью следующего примера, в котором i:=100 раз выделяется и освобождается память для большого массива.

Код:
PROCEDURE Do*;
VAR a: POINTER TO ARRAY 10000000 OF INTEGER;
  i: INTEGER;
BEGIN
  i:=100;
  WHILE i>0 DO
    StdLog.String("Выполняю NEW"); StdLog.Ln();
    NEW(a);
    StdLog.String("Выполняю NIL"); StdLog.Ln();
    a := NIL;
    DEC(i);
  END;
END Do;
Запуская эту процедуру и разглядывая показания Windows Task Manager видно, что память у Windows забирается только один раз, а не i:=100.

Вопрос такой:
Почему-то, после завершения выполнения этой (и подобных ей) процедуры сборщик мусора не торопится отдавать взятую память обратно в систему, хотя сам для себя ее рассматривает свободной (Отдает только после выключения BlackBox 1.4 Shareware Edition). Как убедить сборщик мусора отдать память обратно в систему сразу же после завершения работы процедуры?
Ответить с цитированием
  (#2 (permalink)) Старый
zheromo zheromo вне форума
Новичок
 
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 11.02.2003
По умолчанию 11.02.2003, 12:31

В стандартном обероне функции dispose(), как я понимаю, не предусмотрено. Сама же стратегия сборщика, видимо такая: при выделении памяти под объекты она захватывается до тех пор, пока не исчерпается, потом только запускается сборщик и освобождает память из под ненужных уже объектов. Об операционке и окружении видимо никто не думает. На мой взгляд 1), в настройках сборшика (если таковые имеются) должен задаваться размер кучи, а также стратегия сборки мусора (например, по ссылкам).

1). сам я использую большей частью Pow! (http://www.fim.uni-linz.ac.at/pow/ ) - бесплатную Оберон систему под Win32, также в язык (поддерживает стандартный Оберон, включая Дубовые правила) добавлены некоторые фичи, в том числе функция DISPATCH() заставляющая принудительно освободить память от объекта не дожидаясь процедуры сборки мусора
Ответить с цитированием
  (#3 (permalink)) Старый
Anonymous
Guest
 
Сообщений: n/a
По умолчанию 20.02.2003, 13:56

Подобным образом ведут себя многие менеджеры памяти независимо от сборки мусора. Память берётся у системы большими ломтями, а используется маленькими кусочками. Вернуть же блок можно, только если он пуст. Ситуация довольно редкая и проще не заморачиваться с её отловом, а придержать память - авось ещё пригодиться.
Ответить с цитированием
  (#4 (permalink)) Старый
S.Yu.Gubanov S.Yu.Gubanov вне форума
Member
 
Сообщений: 587
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.12.2002
По умолчанию 20.02.2003, 17:59

Цитата:
Originally posted by Trurl
[b]...Вернуть же блок можно, только если он пуст...
Понятно.
Только все равно что делать то теперь... Поработала програмка, отхапала 400 метров у Винды и держит у себя про запас...
Ответить с цитированием
  (#5 (permalink)) Старый
Anonymous
Guest
 
Сообщений: n/a
По умолчанию 21.02.2003, 11:20

Цитата:
Originally posted by S.Yu.Gubanov
[b]Только все равно что делать то теперь... Поработала програмка, отхапала 400 метров у Винды и держит у себя про запас...
Есть два варианта
1.Поправить менеджер памяти - для BlackBox отпадает.
2.Большие блоки брать через WinAPI (KERNEL32.VirtualAlloc) и возвращать, конечно (KERNEL32.VirtualFree). Правда, теряются преимущества сборки мусора.
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
Anonymous
Guest
 
Сообщений: n/a
По умолчанию 18.04.2003, 07:36

Цитата:
Originally posted by Trurl
[b]Есть два варианта
1.Поправить менеджер памяти - для BlackBox отпадает.
2.Большие блоки брать через WinAPI (KERNEL32.VirtualAlloc) и возвращать, конечно (KERNEL32.VirtualFree). Правда, теряются преимущества сборки мусора.
И что же делать? Что, BlackBox и винды - две вещи несовместимые?
Ответить с цитированием
  (#7 (permalink)) Старый
Anonymous
Guest
 
Сообщений: n/a
По умолчанию 06.05.2004, 19:50

вот народ, даже мануал почитать лень.

идете в хелп запускаете поиск по:

garbage collection

и вуаля!

Services.Collect
Ответить с цитированием
  (#8 (permalink)) Старый
S.Yu.Gubanov S.Yu.Gubanov вне форума
Member
 
Сообщений: 587
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.12.2002
По умолчанию 07.05.2004, 10:48

Цитата:
Originally posted by o_nick
[b]вот народ, даже мануал почитать лень.

идете в хелп запускаете поиск по:

garbage collection

и вуаля!

Services.Collect
Если бы все было так просто...

Проблема не в том что мусор не убирается. Мусор прекрасно убирается и без явного вызова Services.Collect. Проблема в том, что BlackBox не считает нужным отдавать память обратно в Windows. Хотя для самого себя считает ее свободной и доступной для повторного использования.
Ответить с цитированием
  (#9 (permalink)) Старый
Anonymous
Guest
 
Сообщений: n/a
По умолчанию 13.05.2004, 19:54

А если через WinAPI разместить большой кусок, а потом его отдать сразу назад? По идее ЧЯ должен подвинуться (правда при этом подвинеться ещё куча народу).
Ответить с цитированием
  (#10 (permalink)) Старый
Anonymous
Guest
 
Сообщений: n/a
По умолчанию 08.06.2004, 18:06

Цитата:
Originally posted by S.Yu.Gubanov
[b]Проблема не в том что мусор не убирается. Мусор прекрасно убирается и без явного вызова Services.Collect. Проблема в том, что BlackBox не считает нужным отдавать память обратно в Windows. Хотя для самого себя считает ее свободной и доступной для повторного использования.
Я уже говорил об одном извратном решении.
Было замечено, что паямть всё-таки возвращается Винде, если производить выгрузку любого модуля из системы. Можно попытаться вместе с вызовом Services.Collect именно так и поступать - выгружать модуль-"пустышку"... А после Services.Collect, снова вызывать из этой "пустышки" процедуру с NOP... :о)
Ответить с цитированием
  (#11 (permalink)) Старый
Anonymous
Guest
 
Сообщений: n/a
По умолчанию 10.06.2004, 23:02

Цитата:
Originally posted by WLad+-->
Цитата:
<!--QuoteBegin-S.Yu.Gubanov
Цитата:
[b]... Проблема в том, что BlackBox не считает нужным отдавать память обратно в Windows. Хотя для самого себя считает ее свободной и доступной для повторного использования.
... Было замечено, что паямть всё-таки возвращается Винде, если производить выгрузку любого модуля из системы. ...
На длинных расчетах Windows Tast Manager показывает, что Mem Usage флуктуирует и без выгрузки модулей.
Неясно, что это означает.
Ответить с цитированием
  (#12 (permalink)) Старый
Anonymous
Guest
 
Сообщений: n/a
По умолчанию 17.06.2004, 02:45

Цитата:
Originally posted by info21
[b]На длинных расчетах Windows Tast Manager показывает, что Mem Usage флуктуирует и без выгрузки модулей. Неясно, что это означает.
Глупый я : конечно, надо смотреть на VM size...
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задачка на процедуры в Паскале, взгляните. вика123456789 Pascal 2 29.03.2012 10:31
Процедуры))) mozhik Pascal 0 06.11.2011 00:21
сделаю прогу на Мидлет паскале или на Турбо Паскале imported_Ренат Работа 0 03.07.2011 20:51
Процедуры в Asm stas135642 Задания за деньги 7 23.05.2011 16:55
Процедуры swillrocker Pascal 0 20.05.2011 00:58
Процедуры и функции в паскале Novichok92 Pascal 3 09.03.2010 21:13
Процедуры!спасите! Victorija 2707 Pascal 2 09.03.2010 20:33
NEW и DISPOSE использование классов в программе Madgeniy Delphi 1 10.05.2007 18:01
Dispose в рекурсии Madgeniy Delphi 4 19.03.2007 14:13
Корректно ли использование Dispose Anonymous Delphi 3 02.12.2002 11:40



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов