On-line: Andrey, Haz, гостей 0. Всего: 2 [подробнее..]
АвторСообщение





Пост N: 200
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 23.08.13 15:50. Заголовок: Сборщик мусора / очистка памяти


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

Общий смысл таков, что в некоторых местах, связанных с интенсивными расчетами (напр. подгтовка прайс-листа на 5-6 тысяч наименований, сложная комбинированная работа с разными таблицами одновременно и тп) приводит к совершенно непредсказуемым результатам:
- пропадают надписи в SAY в панели с несколькими GET
- программа вылетает/виснет
- программа неожиданно начинает пытаться открыть документ Word/Excel а то и несколько...

Осмысленного объяснения этому процессу дать не могу, поскольку связи с кодом нет точно. Во всяком случае, Clipper в этих местах работал (но зато без звука вылетал в других и намного чаще).

На одной машине даже поймал вот такой отчет:
---
Application Internal Error - D:\tradewin.exe
Terminated at: 2013.08.23 12:12:31
Неисправимая ошибка 9009: hb_xrealloc ене может перераспределить память
Called from AADD(0)
Called from CRLIST(187) in trade206.prg
Called from ADDR2QUEUE(124) in trade206.prg
Called from SALE2QUEUE(209) in trade206.prg
Called from MAKESALEDOCS(1816) in trade224.prg
Called from SALECONT2(593) in trade224.prg
Called from DBVIEW2(4807) in trade225.prg
Called from DO(0)
Called from ACHOICE(0) in ../../../achoice.prg
Called from DBVIEW(4784) in trade225.prg
Called from SALECONTROL(272) in trade224.prg
Called from CHECK4DAMAGE(963) in trade.prg
Called from MAIN(234) in trade.prg
------------------------------------------------------------------------

в Clipper я использовал в критичных местах шаманства наподобие MEMORY(-1) и FT_IamIdle()
В Harbour я естественно их убрал - полагал, что там, где раньше почти хватало 16 мегов памяти, в 1-2 гигабайтах будет где развернуться без проблем.
Похоже, что это не так.

Что нужно использовать для Harbour и в каких случаях ?

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 67 , стр: 1 2 3 4 All [только новые]


администратор




Пост N: 5548
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 26.03.16 23:31. Заголовок: SergKis пишет: Да. ..


SergKis пишет:

 цитата:
Да. Если это случайный сбой


Списал пока на него , буду наблюдать.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 918
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 26.03.16 23:55. Заголовок: Dima можно самому в..


Dima
можно самому в "тонком" месте вызывать сборщик мусора и продолжать потом раблту

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 5549
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 27.03.16 00:01. Заголовок: SergKis пишет: Dima..


SergKis пишет:

 цитата:
Dima
можно самому в "тонком" месте вызывать сборщик мусора и продолжать потом раблту



Как определить тонкое место и его вызвать (сборщика мусора) ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 919
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 27.03.16 00:12. Заголовок: Dima для начала, пе..


Dima
для начала, перед dbAppend или каким то рабочим циклом. Я, например перед созданием окна, вызываю сборщика, принудительно, прога им приостанавливается на это время.

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 5550
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 27.03.16 17:34. Заголовок: SergKis пишет: Я, н..


SergKis пишет:

 цитата:
Я, например перед созданием окна, вызываю сборщика


Как вызываешь ?
Попробовал hb_xfree() , hb_xgrab() , прога не собралась , вероятно они
только для вызова из СИ.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1182
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 27.03.16 18:49. Заголовок: Dima пишет: Попробо..


Dima пишет:

 цитата:
Попробовал hb_xfree() , hb_xgrab()



Это не то.

Функции сборщика (gc - garbage collector) hb_gcAll(), hb_gcStep(), hb_gcSetAuto()



Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 920
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 27.03.16 18:53. Заголовок: Dima вызываю HB_GCA..


Dima
вызываю HB_GCALL() // там параметр отложенный или нет, я без параметров делаю

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 5551
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 27.03.16 19:06. Заголовок: Петр SergKis Спасибо..


Петр
SergKis
Спасибо !
Попробую вызывать его перед созданием MEM: базы и понаблюдаю...

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 5552
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 27.03.16 21:32. Заголовок: SergKis пишет: Пере..


SergKis пишет:

 цитата:
Переведи с mem:.. на temporary


MEM: я создаю и открываю сразу с помощью DBCREATE , опции temporary не вижу там , печаль...

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 921
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 27.03.16 21:57. Заголовок: Dima завтра найду, ..


Dima
завтра найду, сегодня уже башка не варит, не могу найти место где делал

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 5553
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 27.03.16 21:59. Заголовок: SergKis Хорошо...


SergKis
Хорошо.

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3419
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 28.03.16 08:36. Заголовок: Перевыделение памяти..


Перевыделение памяти (вызов hb_xrealloc) выполняется в функции hb_memfsWriteAt из модуля contrib\hbmemio\memio.c
При каждом вызове dbAppend размер файла в памяти увеличивается, значит, как раз идет вызов hb_xrealloc.
Старый блок при этом освобождается, следовательно, происходит дефрагментация памяти.
Насколько эта дефрагментация критична при современных гигантских объемах памяти, доступных программе - трудно сказать. Мне трудно представить, что программа забила вся память так, чтобы система не смогла ей выделить довольно небольшой (относительно) блок.
Можно сделать тест: в цикле делать dbAppend(), и смотреть, сколько итераций выдержит программа.
Другая причина такой ошибки - зацикливание программы, но это, как я понимаю, маловероятно.

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3420
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 28.03.16 09:00. Заголовок: Дополню: если есть п..


Дополню: если есть проблема с дефрагментацией памяти, то сборщик мусора при этом не поможет, так как сборщик мусора освобождает память для переменных, которые уже уничтожены, а не дефрагментирует память.
В таком случае надо использовать не файлы в памяти, а временные файл на диске, т.е. создать файл вызовом
dbCreate(cName, aStruct, cDrv, .t., cAlias), и после закрытия удалить его.

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 5555
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 28.03.16 09:01. Заголовок: Pasha Спасибо что п..


Pasha
Спасибо что прояснил

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 5556
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 28.03.16 09:26. Заголовок: Pasha Паша а каковы..


Pasha
Паша а каковы могут быть причины что программа зависает на QUIT , он же __QUIT() ?
У себя повторить не получилось , ловил зависон при входе на удаленный комп
через Team Viewer , раз 20.
Приложение точно зависает , так как в заголовке окна винда 7 пишет что приложение
не отвечает.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 922
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 28.03.16 09:33. Заголовок: SergKis пишет:завтра..


SergKis пишет:
 цитата:
завтра найду


hb_dbCreateTemp( <cAlias>, <aStruct>, <cRDD>, <cCodePage>, <nConnection> ) -> <lSuccess>
и
INDEX ON <key> TAG <(tag)> temporary

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 5557
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 28.03.16 09:38. Заголовок: SergKis пишет: <..


SergKis пишет:

 цитата:
<nConnection>


А это что и для чего ?


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 923
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 28.03.16 09:45. Заголовок: Dima этот параметр ..


Dima
этот параметр и dbCreate есть, думаю для развития
а INDEX ... TAG ... и без temporary будет временный


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 924
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 28.03.16 09:46. Заголовок: PS база открывается ..


PS
база открывается с заданным алиасом

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 5558
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 28.03.16 09:49. Заголовок: SergKis пишет: база..


SergKis пишет:

 цитата:
база открывается с заданным алиасом


да это я тупанул ))

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 67 , стр: 1 2 3 4 All [только новые]
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 82
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет