29.06.2005, 10:40 | #1 |
Участник
|
Есть примерно такой код в моем классе, исполняемом на стороне клиента (3-х звенка AXAPTA 2.5)
X++: while select name from utilElements group by name where utilElements.recordType == utilElementType::SharedProject { this.otherMethod() } Как следствие, AXAPTA 2.5 вылетает с сообщение о том, что ей не хватает памяти. Существует ли способ указать в AXAPTA 2.5, чтобы она осовбодила уже не используемую память? Пробовал вынести мой метод в отдельный класс и принудительно давать finalize() на этот класс - не помогает Последний раз редактировалось mazzy; 20.06.2017 в 14:15. |
|
29.06.2005, 12:56 | #2 |
Участник
|
В MicrosoftAxaptaCommunity сказали что можно поставить интервал сборки мусора поменьше. Но, мне кажется не поможет - попробуй поискать что-нибудь по всему AOT
|
|
29.06.2005, 13:18 | #3 |
Administrator
|
Зависит от того, что делает otherMethod(). Если он каким-то специальным образом занимает память, то он специально же должен ее и освобождать.
__________________
Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me |
|
29.06.2005, 14:10 | #4 |
Участник
|
Цитата:
Сообщение от Maxim Gorbunov
Зависит от того, что делает otherMethod(). Если он каким-то специальным образом занимает память, то он специально же должен ее и освобождать.
X++: boolean findNodeInProject(ProjectNode _project, str _nodePath) { TreeNodeIterator cursor = _project.iterator(); TreeNode curNode; boolean retVal = false; ; curNode = cursor.next(); while (curNode && ! retVal) { if (curNode.handle() == classNum(ProjectGroupNode)) { retVal = this.findNodeInProject(curNode, _nodePath); } else { retVal = (curNode.treeNodePath() == _nodePath); } curNode = cursor.next(); } return retVal; } Последний раз редактировалось mazzy; 20.06.2017 в 14:19. |
|
29.06.2005, 15:03 | #5 |
Moderator
|
Класс heapCheck методы postCompactingMessage и shrinkPool().
В третьей версии появилась форма sysHeapCheck в которой можно посмотреть как работать с методами класса heapCheck |
|
|
За это сообщение автора поблагодарили: Logger (1). |
29.06.2005, 15:06 | #6 |
Шаман форума
|
<div class='XPPtop'>X++</div><div class='XPP'>[color=:blue]static[/color] [color=:blue]void[/color] SmartHeap(Args _args)
{ HeapCheck hc; [color=:blue]int[/color] i, pageSize, newPageSize; ; hc = [color=:blue]new[/color] HeapCheck(); i = hc.poolCount(); [color=:blue]while[/color] (i>0) { [color=:blue]print[/color] [color=:red]'Data for pool no = '[/color] + int2str( i ); [color=:blue]print[/color] [color=:red]'  FixedBlockSize = '[/color] + int2str( hc.fixedBlockSize(i) ) + [color=:red]'  SmallBlockSize = '[/color] + int2str( hc.smallBlockSize(i) ); pageSize = hc.pageSize(i); [color=:blue]if[/color] (pageSize < 32768) { newPageSize = 2 * pageSize; hc.pageSize( i, newPageSize ); } [color=:blue]else[/color] newPageSize = pageSize; [color=:blue]print[/color] [color=:red]'  Old PageSize = '[/color] + int2str( pageSize ) + [color=:red]'  New PageSize = '[/color] + int2str( newPageSize ); i--; } [color=:blue]pause[/color]; }</div> Це с бывшего technet-а
__________________
All information in this post is strictly confidential. If you have read it in error, please forget it immediately. |
|
29.06.2005, 15:08 | #7 |
Шаман форума
|
Кстати, а кучи "мертвых" коннектов к базе данных при этом не наблюдаете?
__________________
All information in this post is strictly confidential. If you have read it in error, please forget it immediately. |
|
29.06.2005, 16:10 | #8 |
Участник
|
Это, конечно, все очень хорошо. Но может быть Вы все-таки объясните, а что этот класс HeapCheck собственно делает-то? Форма sysHeapCheck есть и в 2.5. Ну, и что? На что я должен обращать внимание? Что запускать?
Насчет "мертвых коннектов" - ничего подобного не наблюдается. Ни подключения к SQL, ни "подвисших" пользователей AXAPTA. Я вообще в отладочной базе сижу один. Никого больше нет. |
|
29.06.2005, 17:22 | #9 |
Moderator
|
Мне вызова этих двух функций хватало в некоторых ситуациях чтобы почистить память. Вообще-то - этот класс просто обертка над библиотекой SmartHeap, документация на которую лежит здесь:
http://www.microquill.com/kb/docs/01_intro.html Честно говоря - сам до конца с этой библиотекой не разбирался - особой надобности не было. Как я понимаю - метод shrink() просто приводит к тому что неиспользуемая память из всех пулов возвращается в ОС. Метод postcompactingMessage посылает приложению сообщение WM_COMPACT. По стандарту - при его получении, приложение должно освободить всю ту память, которая в данный момент не очень нужна. Я так подзреваю - сама Аксапта при получении этого сообщения просто вызывает shrink(). Отличие метода postCompactmessage от прямого вызова Shrink, насколько я понимаю, состоит в том что при получении этого сообщения память будут (по крайней мере - должны ) освобождать и всякие внешние activeX, загруженные в процессе Axapta. Приведенный komarом текст - не оптимален. Правильнее взять текст функции Global::smartheapmemorySizeUp() из каких-нибудь последних сервис-паков третьей версии и перенести на 2.5. Ну и соответственно поставить вызов этой функции куда-нибудь в application.startupPost() |
|
30.06.2005, 10:36 | #10 |
Участник
|
fed, komar, большое спасибо
сделал на основе обсуждения статью УправлениеПамятью. Кстати, не вполне понял из контекста, чем, собственно, занимается функция SmartHeapMemorySizeUp |
|
30.06.2005, 11:39 | #11 |
Moderator
|
SmartHeap управляет памятью как набором страниц. Никакого отношения к страницированию процессора и ОС это страницы не имеют - в первом приближении - это просто гранула захвата и освобождения памяти у ОС. Код этой функции делает очень простую вещь - он считает каким должен быть минимальныйразмер страницы, чтобы мы в принципе смогли захватить всю физически доступную память с одной стороны, и чтобы нам хватило хэндлов Smartheap (ну или как там идентификаторы страниц называются) чтобы всю эту память адресовать. Ну то есть - допустим smartheap может управлять не более чем 128 страницами (условно - точно надо в документации смотреть). Если у нас размер страницы - 1Мбайт и на компе 128 Мбайт оперативки - то все и так хорошо. А если оперативки - 2 Гбайта, то надо размер страницы увеличить до 16Мбайт. Ну в общем - примерно так.
|
|
30.06.2005, 11:45 | #12 |
Участник
|
спасибо.
|
|
30.06.2005, 12:10 | #13 |
Участник
|
2 fed
Я правильно понял: SmartHead не освобождает память, но позволяет работать со всей доступной памятью? Я запустил один раз метод Global::SmartHeapMemorySizeUp() перед запуском моего класса и вылет из-за нехватки памяти прекратился! Хотя использованная память по прежнему НЕ освобождается. Но теперь это уже не имеет значения. Проблема была в том, что вылет происходил тогода, когда физически, еще было куча свободной памяти (вылетала примерно при использовании 450МБ, когда было свободно еще около 800МБ) Всем спасибо. Данная проблема решена. |
|
30.06.2005, 13:47 | #14 |
Шаман форума
|
Классная форма! Нужно было туда еще кнопку - "Свалить в кучу"
[attachment=223:attachment]
__________________
All information in this post is strictly confidential. If you have read it in error, please forget it immediately. |
|
01.07.2005, 11:17 | #15 |
Участник
|
На всякий случай:
Использование Global::SmartHeapMemorySizeUp() приводит к очень неприятным последствиям. Та копия AXAPTA в которой происходит вызов этого метода по прежнему работает нормально, но попытка открыть любой другое приложение (новое) может привести к непредсказуемым визуальным "спец.эффектам" на экране до тех пор, пока не будут закрыты все открытые копии AXAPTA. Впрочем, в моем случае это не принципиально. Я могу просто перезагрузить свою копию AXAPTA после выполнения нужного метода. Но использовать его в рабочем приложении не рекомендуется |
|
01.07.2005, 11:40 | #16 |
Moderator
|
Начиная с Axapta 3.0 sp2 (кажется - sp2), smartheapMemorySizeUp вызывается при запуске приложения в классе Info::startup(). Правда - в этом самом sp2 произошел переход на новую версию smartheap library (с 4.01 на 6.01). Так что, скорее всего, та проблема о которой пишет Владимир Максимов, специфична для старых версий Axapta (точнее старых версий smartheap)
|
|