освобождение памяти при работе с динамическими объектами
От: vedmalex Россия  
Дата: 05.09.03 11:25
Оценка:
Проблема заключается в следующем:
Есть прога — модель СМО(ситсемы массового обслуживания) а конкретно модель СУБД.
Все прекрасно работает без исключений и прочее.
Моделирование: все элементы модели Объкты дерево. Динамически путем копирования создаются структуры типа запросы, которые далее удаляются в одном из блоков. Удаляется все тоже по правилам по всем. НО полсе создания примерно 450 000 штук запросов(объектов типа запрос) размер ОП выделяемой программой увеличивается на 120 М получается что структура размером 300 байт не удаляется вопреки ожиданиям. После завершения программы размер свободной ОП восстанавливается.
Т.е. я понимаю что после вызова деструктора память не освобождаемтся.
Я так понимаю, все объекты типа наслеуемые от TObject являются динамичесмкими — размещаются в "КУЧЕ". Если не так поправьте меня.

Вопрос каким образом заставить ОС или программу освобождать память после удаления объектов.
Re: освобождение памяти при работе с динамическими объектами
От: Аноним  
Дата: 05.09.03 12:29
Оценка:
Здравствуйте, vedmalex, Вы писали:

V>Проблема заключается в следующем:

V>Есть прога — модель СМО(ситсемы массового обслуживания) а конкретно модель СУБД.
V>Все прекрасно работает без исключений и прочее.
V>Моделирование: все элементы модели Объкты дерево. Динамически путем копирования создаются структуры типа запросы, которые далее удаляются в одном из блоков. Удаляется все тоже по правилам по всем. НО полсе создания примерно 450 000 штук запросов(объектов типа запрос) размер ОП выделяемой программой увеличивается на 120 М получается что структура размером 300 байт не удаляется вопреки ожиданиям. После завершения программы размер свободной ОП восстанавливается.
V>Т.е. я понимаю что после вызова деструктора память не освобождаемтся.
V>Я так понимаю, все объекты типа наслеуемые от TObject являются динамичесмкими — размещаются в "КУЧЕ". Если не так поправьте меня.

V>Вопрос каким образом заставить ОС или программу освобождать память после удаления объектов.


Всё правильно, они именно там и размещаются. Если у тебя объекты одного типа и их много, как раз как в твоём случае, то логичнее
использовать (и самому в этом случае управлять) виртуальную
память — это функции VirtualAlloc(...), VirtualFree. С ними по крайней мере ты сам резервируешь регион, сам коммитишь память и сам же её
возвращаешь системе и освобждаешь регион. (Возьми книжку Дж. Рихтер "Создание эффективных Win32 приложений" там про
это всё отлично расписано).

Удачи!
Re: освобождение памяти при работе с динамическими объектами
От: Аноним  
Дата: 05.09.03 12:30
Оценка:
>Я так понимаю, все объекты типа наслеуемые от TObject являются динамичесмкими — размещаются в "КУЧЕ". Если не так >поправьте меня.

Смотря что понимать под кучей.
Если стандартную виндовскую кучу — то нет.
У Борланда свой менеджер памяти, который получает память непосредственно у
системы через VirtualAlloc и сам решает, когда возвратить её системе.
Чесно говоря, я слабо представляю, как можно заставить стандартный менеджер форсировать это действие,
кроме как использовать другой менеджер.
(Или перекрыть InitInstance/FreeInstance для запроса).

А структуры там ещё откуда — это место я не понял.
Re[2]: освобождение памяти при работе с динамическими объект
От: vedmalex Россия  
Дата: 08.09.03 04:05
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Всё правильно, они именно там и размещаются. Если у тебя объекты одного типа и их много, как раз как в твоём случае, то логичнее

А>использовать (и самому в этом случае управлять) виртуальную
А>память — это функции VirtualAlloc(...), VirtualFree. С ними по крайней мере ты сам резервируешь регион, сам коммитишь память и сам же её
А>возвращаешь системе и освобждаешь регион. (Возьми книжку Дж. Рихтер "Создание эффективных Win32 приложений" там про
А>это всё отлично расписано).

А>Удачи!


Спасибо, в общем понятно каким образом дейсвтовать.
Ок Буду искать варианты.
Re[2]: освобождение памяти при работе с динамическими объект
От: vedmalex Россия  
Дата: 08.09.03 04:10
Оценка:
Здравствуйте, Аноним, Вы писали:

А>А структуры там ещё откуда — это место я не понял.


я честно говоря сам не понял, просто выделяется память и все под динамический объект типа class,
да я почитал доки — память освобождается автоматически после удаления объекта — вызова методов destroy/free.
т.е. я понял это просто несовершенство разработки.
Re: освобождение памяти при работе с динамическими объектами
От: vedmalex Россия  
Дата: 08.09.03 04:12
Оценка:
Здравствуйте, vedmalex, Вы писали:

модель запускается в отдельном потоке — может эта трабла из-за этого??
Хотя я вообще то сомневаюсь.

Ну всем спасибо буду искать дальше.
Re[2]: освобождение памяти при работе с динамическими объект
От: Leonid Troyanovsky  
Дата: 08.09.03 07:16
Оценка:
Здравствуйте, vedmalex, Вы писали:

V>модель запускается в отдельном потоке — может эта трабла из-за этого??

V>Хотя я вообще то сомневаюсь.

И я тоже сомневаюсь. Исполнение в потоке могло только усугубить
уже существующие проблемы.

V>Ну всем спасибо буду искать дальше.


А что, собс-но, ты ищешь?

--
С уважением, LVT.
--
С уважением, LVT
Re: освобождение памяти при работе с динамическими объектами
От: ArtDenis Россия  
Дата: 08.09.03 07:25
Оценка:
Здравствуйте, vedmalex, Вы писали:
V>Есть прога — модель СМО(ситсемы массового обслуживания) а конкретно модель СУБД.
V>Все прекрасно работает без исключений и прочее.
V>Моделирование: все элементы модели Объкты дерево. Динамически путем копирования создаются структуры типа запросы, которые далее удаляются в одном из блоков. Удаляется все тоже по правилам по всем. НО полсе создания примерно 450 000 штук запросов(объектов типа запрос) размер ОП выделяемой программой увеличивается на 120 М получается что структура размером 300 байт не удаляется вопреки ожиданиям. После завершения программы размер свободной ОП восстанавливается.
V>Т.е. я понимаю что после вызова деструктора память не освобождаемтся.

А что BoundsChecker говорит?
... << RSDN@Home 1.1 beta 1 >>
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[2]: освобождение памяти при работе с динамическими объект
От: Аноним  
Дата: 08.09.03 10:37
Оценка:
Здравствуйте, ArtDenis, Вы писали:
AD>А что BoundsChecker говорит?

просто на Pascal кажется нет такого.
просто проблемма состоит в том что базовые классы моей модели написаны на Object Pascal
Re[3]: освобождение памяти при работе с динамическими объект
От: Аноним  
Дата: 08.09.03 10:41
Оценка:
Здравствуйте, Leonid Troyanovsky, Вы писали:

LT> А что, собс-но, ты ищешь?


Решение проблеммы, Освобождения памяти.
Я просто думаю может что еще не доделал или переборщил,
но вроде бы с сотового взгляда все правильно, все объекты освобождаю ни где ошибок нет, исключений тоже. а вот память освобождается только после выхода из программы.
Re[4]: освобождение памяти при работе с динамическими объект
От: Leonid Troyanovsky  
Дата: 08.09.03 11:14
Оценка:
Здравствуйте, Аноним, Вы писали:

LT> А что, собс-но, ты ищешь?


А>Решение проблеммы, Освобождения памяти.

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

Во-первых, непонятно как ты оцениваешь размер свободной памяти.
Если ты смотришь из Task Manager(NT-XP) — это не совсем то, чем кажется. (Если приложение с формой, то попробуй, например, свернуть и развернуть его).
Оценивать же свое приложение лучше с помощью Performarnce Monitor, для объекта Process (своего приложения).

Ну, а по существу — 450 тыс. объектов — если они все время создаются и
разрушаются — на мой взгляд — перебор. Лучше попытаться описывать _это_ не
объектами а записями, т.е. TMyQuery = record .. end;
Память же для такого массива не грех распределить самому, т.е.
VirtualAlloc. Тогда и за ее освобождение (VirtualFree) пенять придется
только на себя.
Если же нужно все это хозяйство хранить (на диске) то лучше сразу
смотреть в сторону CreateFileMapping — MapViewOfFile.

--
С уважением, LVT.
--
С уважением, LVT
Re[5]: освобождение памяти при работе с динамическими объект
От: vedmalex Россия  
Дата: 10.09.03 04:17
Оценка:
Здравствуйте, Leonid Troyanovsky, Вы писали:
LT> Во-первых, непонятно как ты оцениваешь размер свободной памяти.
LT> Если ты смотришь из Task Manager(NT-XP) — это не совсем то, чем кажется. (Если приложение с формой, то попробуй, например, свернуть и развернуть его).
LT> Оценивать же свое приложение лучше с помощью Performarnce Monitor, для объекта Process (своего приложения).

LT> Ну, а по существу — 450 тыс. объектов — если они все время создаются и

LT> разрушаются — на мой взгляд — перебор. Лучше попытаться описывать _это_ не
LT> объектами а записями, т.е. TMyQuery = record .. end;
LT> Память же для такого массива не грех распределить самому, т.е.
LT> VirtualAlloc. Тогда и за ее освобождение (VirtualFree) пенять придется
LT> только на себя.
LT> Если же нужно все это хозяйство хранить (на диске) то лучше сразу
LT> смотреть в сторону CreateFileMapping — MapViewOfFile.

Да на самао деле по таск менеджеру но только рост оперативки на столько силен что ни какие свертываения окон не помогают.

а 450 тысяч объектов за моджельное время около 2 часов, по машинному около минуты

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

А запросы они уничтожаются не сразу а по прохождению определенных блоков
В общем так проще чем использовать записи, к тому же есть возможность расширения.
просто хочется красиво сделать
Re[6]: освобождение памяти при работе с динамическими объект
От: Leonid Troyanovsky  
Дата: 10.09.03 05:22
Оценка:
Приветствую, vedmalex.

> нет все не совсем так, запрос это класс по определению, содержит кучу функций и всякой лабуды типа

> список селект полей
> список полей в условии и мне проще написать класс один раз а затем выполняя функцию
> copy этого класса клонировать эти запросы, потому как они на самом деле стандартные или входят в состав стандартных транзакций.
> это уже вопрос проектирования,

Ну, тогда NewInstance/FreeInstance тебе в руки.
По-крайней мере сам сможешь следить за своей памятью.
Правда, другие объекты, входящие в поля будут по-прежнему управляться дельфийским менеджером.

--
С уважением, LVT.
Posted via RSDN NNTP Server 1.7 beta
--
С уважением, LVT
Re[7]: освобождение памяти при работе с динамическими объект
От: Аноним  
Дата: 10.09.03 05:26
Оценка:
Здравствуйте, Leonid Troyanovsky, Вы писали:

LT> Ну, тогда NewInstance/FreeInstance тебе в руки.

LT> По-крайней мере сам сможешь следить за своей памятью.
LT> Правда, другие объекты, входящие в поля будут по-прежнему управляться дельфийским менеджером.

ОК.
Но я так же подумаю на счет размещения в записи,
по крайней мере можно создать объект который будет работать с запросами типа рекорд.

Спасибо за наметку
Re[7]: освобождение памяти при работе с динамическими объект
От: Sinclair Россия https://github.com/evilguest/
Дата: 10.09.03 05:36
Оценка:
Здравствуйте, Leonid Troyanovsky, Вы писали:

LT> Правда, другие объекты, входящие в поля будут по-прежнему управляться дельфийским менеджером.

Ну, его тоже заменить не проблема. Можно посмотреть исходник ShareMem для примера.
... << RSDN@Home 1.1 beta 2 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[8]: освобождение памяти при работе с динамическими объект
От: Leonid Troyanovsky  
Дата: 10.09.03 06:34
Оценка:
Приветствую, Sinclair.

LT> Правда, другие объекты, входящие в поля будут по-прежнему управляться дельфийским менеджером.

> Ну, его тоже заменить не проблема. Можно посмотреть исходник ShareMem для примера.

Да, конечно. Правда, на практике с таким не сталкивался, т.к. мне сложно предложить нечто более эффективное, скажем, для строк или вариантов Скорее, я мог бы столкнуться с вариантом замены библиотечного менеджера на таковой из приложения, но и это, слава Богу, меня миновало.

--
С уважением, LVT.
Posted via RSDN NNTP Server 1.7 beta
--
С уважением, LVT
Re[8]: освобождение памяти при работе с динамическими объект
От: Leonid Troyanovsky  
Дата: 10.09.03 07:22
Оценка: +1
Приветствую.

> Но я так же подумаю на счет размещения в записи,

> по крайней мере можно создать объект который будет работать с запросами типа рекорд.

Удобно размышлять над записями, как над объектами, разместив методы работы с ними в отдельном модуле.

Процедуры(глобальные) этого модуля принимают первым параметром указатель на обрабатываемую запись.
Конечно, писать приходится немного больше, чем в случае объектов, но логика практически такая же.
Также это облегчает создание истинно объектной оболочки (если она вдруг потребуется), путем написания объекта-прокси.

--
С уважением, LVT.
Posted via RSDN NNTP Server 1.7 beta
--
С уважением, LVT
Re[9]: освобождение памяти при работе с динамическими объект
От: vedmalex Россия  
Дата: 10.09.03 08:02
Оценка:
Здравствуйте, Leonid Troyanovsky, Вы писали:

LT> Процедуры(глобальные) этого модуля принимают первым параметром указатель на обрабатываемую запись.

LT> Конечно, писать приходится немного больше, чем в случае объектов, но логика практически такая же.
LT> Также это облегчает создание истинно объектной оболочки (если она вдруг потребуется), путем написания объекта-прокси.

ОК.
Что то похожее я и собираюсь сделать.
Спасибо.
Re: освобождение памяти при работе с динамическими объектами
От: Prinzip  
Дата: 10.09.03 08:19
Оценка:
У меня та же проблема.
А как правильно удалять свой компонент? Я его создаю на форме, удаляю, а он всё висит и на все события реагирует. Создаю new, удаляю delete.
Re[2]: освобождение памяти при работе с динамическими объект
От: Вячеслав Ермолаев  
Дата: 10.09.03 08:29
Оценка:
Здравствуйте, Prinzip, Вы писали:

P>У меня та же проблема.

P>А как правильно удалять свой компонент? Я его создаю на форме, удаляю, а он всё висит и на все события реагирует. Создаю new, удаляю delete.
Очень сранно. Никогда с подобным не сталкивался. По подробнее можно?
С уважением, Вячеслав Ермолаев
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.