Страница: 1 | 2 | 3 | 4 |
Вопрос: Очистка памяти
Добавлено: 30.06.05 11:19
Автор вопроса: LamerOnLine | ICQ: 334781088
Может тема была, не помню...
Проблема в следующем - есть приложение, с динамической подгрузкой форм и объектов. После закрытия некоторых форм память освобождается не полностью, хотя позже все устаканивается. Но при частой работе потери памяти достигают о-го-го...
Вопрос - как можно принудительно очистить выделенную память объекта?
Ответы
Всего ответов: 47
Номер ответа: 1
Автор ответа:
Mihalыch
ICQ: 373-509-101
Вопросов: 56
Ответов: 330
Профиль | | #1
Добавлено: 30.06.05 13:42
Это конечно не решит проблему, но иногда немного памяти освободить удается.
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Set Me = Nothing
End Sub
Или так
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
 im obj As Object
For Each obj In Me
On Error Resume Next
Set obj = Nothing
Next
Set Me = Nothing
End Sub
Номер ответа: 2
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #2
Добавлено: 30.06.05 17:08
Не, тут все несколько сложнее. Есть объекты, содержащие формы со многими контролами. Создаются объекты через CreateObject. При установки их в Nothing освобождается намного меньше памяти чем они занимают. В памяти продолжают находится их библиотеки. Хотя через пару минут они оттуда уходят. Примечательно что самого объекта уже как бы не существует, ссылок на него нет, событие Terminate отработало.
Может тогда кто знает как загасить эти dll и ocx в памяти? FreeLibrary результата не дает, TerminateThread недопустим - поток один. Может как-нить через HeapFree...
Небось кто-нить сталкивался.
Номер ответа: 3
Автор ответа:
Morpheus
Вопросов: 224
Ответов: 3777
Web-сайт:
Профиль | | #3
Добавлено: 30.06.05 17:28
не знаю, может не в тему, но как происходит выход из приложения? не TerminateProcess случайно? если случайно нет, попробуй разослать всему, что шевелится WM_CLOSE
Номер ответа: 4
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #4
Добавлено: 30.06.05 17:57
Думаю что тебе это поможет
If Not OS_Version.dwPlatformId = &H2 Or OS_Version.dwMajorVersion < &H5 Then Exit Sub
Call SetProcessWorkingSetSize(GetCurrentProcess, &HFFFF, &HFFFF)
End Sub
Все без деклараций, ну да ты разберешься...
Номер ответа: 5
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #5
Добавлено: 30.06.05 18:02
Всем пасибо. Проблема решалась элементарным способом - CoFreeUnusedLibraries ))))
Номер ответа: 6
Автор ответа:
Comanche
Вопросов: 87
Ответов: 459
Профиль | | #6
Добавлено: 30.06.05 18:21
Любопытно. Добавил себе в "Избранное".
Номер ответа: 7
Автор ответа:
JenkA
ICQ: 721440
Вопросов: 4
Ответов: 5
Профиль | | #7
Добавлено: 06.07.05 09:00
закинь примерчик CoFreeUnusedLibraries если не сложно.
ekory@yahoo.com
Номер ответа: 8
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #8
Добавлено: 06.07.05 10:55
Какой тут может быть примерчик? Декларируй и юзай. Результаты посмотреть можешь тем же Process Viewer'ом. Хотя совет sne тоже помог.
Номер ответа: 9
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #9
Добавлено: 06.07.05 10:58
Думаю, лучше всего использовать их вместе. SetProcessWorkingSetSize освобождает много физической памяти от всякого барахла, и свопит то что не щас не нужно. Помогает здорово, но, к сожалению, библиотеки все равно толкутся в памяти. CoFreeUnusedLibraries их исправно выгружает. Реально скорость работы приложения повысилась раза в полтора.
Номер ответа: 10
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #10
Добавлено: 06.07.05 19:29
Реально скорость работы приложения повысилась раза в полтора
Очень интересно. За счёт чего? Как измерялась скорость?
Номер ответа: 11
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #11
Добавлено: 07.07.05 10:49
Когда приложение использует уйму тяжеловесных окон + БД - тормоза уже налицо, бенчмарк тут не нужен
А скорость возросла именно из-за существенного увеличения объема свободной физической памяти.
Номер ответа: 12
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #12
Добавлено: 07.07.05 11:20
>> Когда приложение использует уйму тяжеловесных окон
А потом эти окошки ей приходится загружать обратно в память чтобы повторно использовать (если часто, то должны быть тормоза).... вобщем страно это, типа двойной эффект... может на компе просто памяти не хватает ?
Номер ответа: 13
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #13
Добавлено: 07.07.05 15:39
Это не программа стала быстрее работать, а винда стала меньше тормозить и больше времени выделять программе.
Нагромождение объектов, нерациональное использование системных ресурсов заставляют винду отрывать время от выполнения собственно кода и тратить его на расчистку завалов, создаваемых программой.
Прелести ООП
ООП форева!!!
Номер ответа: 14
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #14
Добавлено: 07.07.05 16:02
Орден Шелкового Умника в студию!!
Номер ответа: 15
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #15
Добавлено: 07.07.05 16:18
Ну так взяли бы и добавили такую функцию в VB. Что им жалко что ли?