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

Вниз

Проблемы с памятью   Найти похожие ветки 

 
ki11er   (2003-09-18 14:50) [0]

Есть большое приложение, написанное на Delphi. При длительной работе оно начинает притормаживать. По диспетчеру задач видно, что вроде как растет количество используемой памяти. Но бодания с MemProof, BoundsChecker и Purify ни к чему не приводят - они показывают, что все ок.
В чем может быть проблема?

Спасибо.


 
Digitman   (2003-09-18 14:56) [1]


> В чем может быть проблема


в ошибках алгоритма


 
ki11er   (2003-09-18 15:13) [2]

какого алгоритма?
Если имеется в виду, что программа постоянно выделяет память и не освобождает до выхода, то такого нет - проверял уже. Дэлфийный счетчик блоков не растет.


 
Digitman   (2003-09-18 15:17) [3]


> Дэлфийный счетчик блоков не растет.


а что такое "дэлфийный счетчик блоков" ?


 
ki11er   (2003-09-18 15:21) [4]


> а что такое "дэлфийный счетчик блоков" ?

мда...
AllocMemCount


 
Digitman   (2003-09-18 15:36) [5]


> ki11er


) ..слышал звон, да не знаешь где он)

ты вообще комментарии читал к этой ф-ции ?
ты вник, в КАКИХ конкретно случаях актуальна и достоверна эта инф-ция ?


 
Digitman   (2003-09-18 15:43) [6]

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

читай внимательно комментарии к ф-ции и сравнивай существующие у тебя условия с теми, для которых описано отдельное поведение ф-ции


 
ki11er   (2003-09-18 15:55) [7]


> ) ..слышал звон, да не знаешь где он)

8-D Вот именно!
Во-первых, это не функция, а переменная.
Во-вторых "программный модуль" только один.
В-третих, раз уж на то пошло, как определить, сколько мэнэджеров существует в скомпилированном приложении и как получить к ним доступ?


 
Digitman   (2003-09-18 16:06) [8]


> это не функция, а переменная


не суть как важно


> "программный модуль" только один.


на основании чего ты утверждаешь это ?


> сколько мэнэджеров существует в скомпилированном приложении
> и как получить к ним доступ


надо уяснить, как программные модули взаимодействуют в твоем приложении, как они собраны линкером, используются ли run-time packages, где и как


 
ki11er   (2003-09-18 16:09) [9]

ну расскажи про все случаи.
или хотя бы некоторые...


 
Digitman   (2003-09-18 16:12) [10]


> ki11er


а почитать ? коментарии в хэлпе к тому, о чем речь ведешь ?


 
ki11er   (2003-09-18 16:22) [11]

в коментариях (по крайней мере в тех, о которых идет речь) про мэнэджеры ничего не сказано. Упоминается функция GetAllocMemCount, про которую я что-то не могу ничего найти...


 
Digitman   (2003-09-18 16:26) [12]

зато там сказано про run-time packages и static-dinamic loaded libraries ... это ОЧЕНЬ важный момент !


 
Digitman   (2003-09-18 16:29) [13]


> ki11er


ты пойми, что переменных AllocMemCount столько, ксолько экземпляров System.pas загружено в ВАП процесса !


 
ki11er   (2003-09-18 16:32) [14]

не сомневаюсь ;-)
только все как-то наоборот... там правильно написано?
ты хочешь сказать, что
"своя переменная AllocMemCount" = "свой мэнэджер памяти"?
как-то не совсем логично тогда, что при статик линковке получаем несколько менеджеров, а при рантайм - один. По идее, все с точностью до наоборот должно быть.


 
ki11er   (2003-09-18 16:33) [15]

да, между прочим,
ВАП - это что?


 
Digitman   (2003-09-18 16:51) [16]


> ki11er



> ВАП - это что?


ВАП = Виртуальное Адресное Пространство процесса


> как-то не совсем логично


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

это раз

кр.того, твой код (где бы он не находился, в каком бы модуле, как бы этот модуль ни линковался) может неявно использовать какие-то системные или 3rd-party DLL, где речи о борландовском менеджере вообще не идет.. и которые тоже вполне могут запрашивать блоки непосредственно из куч процесса

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


 
Murad   (2003-09-18 16:54) [17]

2ki11er
2Digitman
Простите что вмешиваюсь в Ваш диалог... возможно просто это
поможет ki11er. Есть утилита под Delphi... MemorySleuth
(TurboPower), в ней очень удобно утечки ловить


 
ki11er   (2003-09-18 16:56) [18]


> с этого надо начать, прежде чем делать какие-то умозаключения

Нет, прежде нужно сначала со своим кодом разобраться, а уж потом чужой ковырять...
Вопрос остается в силе. Сколько дэлфийных мэнэджеров памяти будет в "ВАП" при условии использования "голого" дэлфи (т.е. только стандартные компоненты из поставки) в случаях:
1. Статическая линковка всех библиотек
2. Рантайм билиотеки (опять же все)
3. Часть библиотек статическая, часть - рантайм
...
И как добраться до _всех_ мэнэджэров в этих случаях?


 
ki11er   (2003-09-18 17:04) [19]

Murad
Я знаю про эту штуку. Но она как бы не дешевая... Можешь поделиться?


 
Murad   (2003-09-18 17:10) [20]

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


 
Digitman   (2003-09-18 17:14) [21]

каждый программный модуль, построенный в виде BPL/DLL (и, соответственно, динамически или статически подгружаемый в run-time твоим процессом), имеет собственный экземпляр менеджера

когда же ты ведешь речь о статической линковке КОНКРЕТНОГО МОДУЛЯ (т.е линковке этого модуля на этапе сборки конкретного проекта, а не линковке в ран-тайм !), то следует четко понимать : в этом модуле будут использованы DCU, которые будут ссылаться на один-единственный экземпляр system.dcu


 
ki11er   (2003-09-18 17:27) [22]

Я веду речь о "птичке" "Build with runtime packages". Что будет в случае, когда она включена и что будет, когда выключена?


 
Verg   (2003-09-18 17:39) [23]

А что показывает AllocMemSize?


 
Digitman   (2003-09-18 17:39) [24]


> когда она включена


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


> когда выключена


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


 
ki11er   (2003-09-18 17:50) [25]


> то текущий собираемый проект в ран-тайм будет грузить и
> использовать указанные внешние BPL, каждая из которых содержит
> свой собственный экз-р модуля System


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


Логично...
Но,
1. Но в хелпе-то не так написано: "Applications that use runtime packages and do not use any statically linked DLLs can safely access AllocMemCount directly."
2. Птичка у меня отключена, так что возвращаемся к началу дискуссии.
3. Что все-таки насчет GetAllocMemCount?


 
Verg   (2003-09-18 17:53) [26]

Повторю:

А что показывает AllocMemSize?


 
ki11er   (2003-09-18 17:57) [27]


> А что показывает AllocMemSize?

Суммарный размер выделенных блоков.
Тоже не растет - держится в определенных пределах.


 
Digitman   (2003-09-18 17:59) [28]


> Но в хелпе-то не так написано


правильно написано.


> Птичка у меня отключена


зато возможно некоторые прилинкованные в билд-тайм DCU могут в ран-тайм обращаться к иным библиотекам, в т.ч. и к 3rd-party BPL

единый же борландовский менеджер будет использован либо
- в случае когда ни одна BPL не используется
- в случае когда все ран-тайм модули (и EXE и BPL и DLL) собраны с модулем ShareMem и обращаются, соотв-но, к единой библ-ке BorlandMM.dll, реализующей менеджер памяти


 
ki11er   (2003-09-18 18:16) [29]


> > Но в хелпе-то не так написано
> правильно написано.

Тогда ты не совсем прав.


> зато возможно некоторые прилинкованные в билд-тайм DCU могут
> в ран-тайм обращаться к иным библиотекам, в т.ч. и к 3rd-party
> BPL

Не могут, так как никаких бэпээлей нет на диске _физически_


 
Verg   (2003-09-18 18:20) [30]


> Тоже не растет - держится в определенных пределах.


Значит кто-то все же ползуясь недельфозным МП (или его другой копией) забывает возвращать память.
Было у меня такое, когда я в одном потоке, чтобы не делить время со штатным МП (главный поток) использовал вместо getmem localalloc. Ну и забывал иногда про LocalFree.


 
ki11er   (2003-09-18 18:42) [31]

2 Verg
Логично...
Но никакие программой dll не используются (по крайней мере по собственной инициативе, т.е. не считая тех библиотек, которые подгружает система - типа спулер и т.п.)


 
Владислав   (2003-09-18 18:46) [32]

> Digitman ©

Слушайте, Вы последнее время стали таким нудным... Я первый, кто об этом говорит? Надеюсь, что я не прав ;)

> ki11er (18.09.03 14:50)

Скажи, сколько, по твоему мнению, утекает памяти. За какое время (Ну типа скорость)

В чем может быть проблема?

Да в чем угодно. Много возможностей возникновения проблемы тебе Digitman описал. В остальных постах, быть может, тоже истина скрывается.

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


 
Verg   (2003-09-18 18:48) [33]

Я и не говорил про dll.


> Но никакие программой dll не используются


Но и чудес же не бывает.


 
Владислав   (2003-09-18 18:51) [34]

> Verg © (18.09.03 18:48) [33]

Ага. Фантастика.


 
ki11er   (2003-09-18 18:56) [35]


> Скажи, сколько, по твоему мнению, утекает памяти. За какое
> время (Ну типа скорость)

Это довольно сложно оценить, так как сначала течет медленно, потом (где-то через неделю-две) - по экспоненте ;-)


 
ki11er   (2003-09-18 18:57) [36]


> Но и чудес же не бывает.

Согласен. Но что делать? Типа алгоритма - проверь то, посмотри это и т.п. А то только общие рассуждения - я такие советы и сам могу тоннами давать ;-)))


 
Владислав   (2003-09-18 18:58) [37]

> ki11er (18.09.03 18:56) [35]

Наверное, надо прислушаться Verg © (18.09.03 18:20) [30]


 
Verg   (2003-09-18 19:01) [38]

Я тебе советую - проверь localalloc никто не делает (и при чем тут dll?)


 
Владислав   (2003-09-18 19:02) [39]

> ki11er (18.09.03 18:57) [36]

Блин, выложи код на FTP. Мы начнем искать ошибку (утечку памяти) в твоей программе и перестанем давать глупые советы...

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


 
ki11er   (2003-09-18 19:21) [40]


> Я тебе советую - проверь localalloc никто не делает (и при
> чем тут dll?)

Проверить проверю, но 99%, что этого нет.


> Блин, выложи код на FTP.

;-) Мег 10 исходников 8-? Да и не могу - денег стоит ;-)



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

Форум: "Основная";
Текущий архив: 2003.10.02;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.011 c
1-3944
Николай
2003-09-21 09:23
2003.10.02
схожу с ума...


1-3948
tim5
2003-09-20 22:38
2003.10.02
Image и PopupMenu.


3-3798
rosl
2003-09-11 09:48
2003.10.02
Перенос копирование записей


14-4047
Красная майка
2003-09-04 10:41
2003.10.02
И снова MMP (Moscow Mastak Party ;)!!! Встреча Мастаков в Москве!


9-3700
Agent[007]
2003-03-26 17:58
2003.10.02
Какое событие?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский