AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 29.06.2005, 10:40   #1  
Владимир Максимов_imported is offline
Владимир Максимов_imported
Участник
 
33 / 10 (1) +
Регистрация: 20.01.2004
Есть примерно такой код в моем классе, исполняемом на стороне клиента (3-х звенка AXAPTA 2.5)

X++:
  while select name from utilElements
    group by name
    where utilElements.recordType == utilElementType::SharedProject
  {
    this.otherMethod()
  }
Вот этот самый otherMetod() в процессе своей работы занимает часть памяти и не освобождает ее после своего завершения. Более того, завершение всего класса также не приводит к освобождению занятой памяти.

Как следствие, AXAPTA 2.5 вылетает с сообщение о том, что ей не хватает памяти.

Существует ли способ указать в AXAPTA 2.5, чтобы она осовбодила уже не используемую память?

Пробовал вынести мой метод в отдельный класс и принудительно давать finalize() на этот класс - не помогает

Последний раз редактировалось mazzy; 20.06.2017 в 14:15.
Старый 29.06.2005, 12:56   #2  
mugz is offline
mugz
Участник
 
107 / 10 (1) +
Регистрация: 05.08.2004
В MicrosoftAxaptaCommunity сказали что можно поставить интервал сборки мусора поменьше. Но, мне кажется не поможет - попробуй поискать что-нибудь по всему AOT
Старый 29.06.2005, 13:18   #3  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Зависит от того, что делает 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  
Владимир Максимов_imported is offline
Владимир Максимов_imported
Участник
 
33 / 10 (1) +
Регистрация: 20.01.2004
Цитата:
Сообщение от 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  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,895 / 5650 (194) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
Класс heapCheck методы postCompactingMessage и shrinkPool().

В третьей версии появилась форма sysHeapCheck в которой можно посмотреть как работать с методами класса heapCheck
За это сообщение автора поблагодарили: Logger (1).
Старый 29.06.2005, 15:06   #6  
komar is offline
komar
Шаман форума
Аватар для komar
Ex AND Project
 
5,571 / 600 (32) +++++++
Регистрация: 24.05.2002
<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]' &nbspFixedBlockSize = '[/color] + int2str( hc.fixedBlockSize(i) ) + [color=:red]' &nbspSmallBlockSize = '[/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]' &nbspOld PageSize = '[/color] + int2str( pageSize ) + [color=:red]'   &nbspNew 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  
komar is offline
komar
Шаман форума
Аватар для komar
Ex AND Project
 
5,571 / 600 (32) +++++++
Регистрация: 24.05.2002
Кстати, а кучи "мертвых" коннектов к базе данных при этом не наблюдаете?
__________________
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  
Владимир Максимов_imported is offline
Владимир Максимов_imported
Участник
 
33 / 10 (1) +
Регистрация: 20.01.2004
Это, конечно, все очень хорошо. Но может быть Вы все-таки объясните, а что этот класс HeapCheck собственно делает-то? Форма sysHeapCheck есть и в 2.5. Ну, и что? На что я должен обращать внимание? Что запускать?

Насчет "мертвых коннектов" - ничего подобного не наблюдается. Ни подключения к SQL, ни "подвисших" пользователей AXAPTA. Я вообще в отладочной базе сижу один. Никого больше нет.
Старый 29.06.2005, 17:22   #9  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,895 / 5650 (194) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
Мне вызова этих двух функций хватало в некоторых ситуациях чтобы почистить память. Вообще-то - этот класс просто обертка над библиотекой 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  
mugz is offline
mugz
Участник
 
107 / 10 (1) +
Регистрация: 05.08.2004
fed, komar, большое спасибо
сделал на основе обсуждения статью УправлениеПамятью. Кстати, не вполне понял из контекста, чем, собственно, занимается функция SmartHeapMemorySizeUp
Старый 30.06.2005, 11:39   #11  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,895 / 5650 (194) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
SmartHeap управляет памятью как набором страниц. Никакого отношения к страницированию процессора и ОС это страницы не имеют - в первом приближении - это просто гранула захвата и освобождения памяти у ОС. Код этой функции делает очень простую вещь - он считает каким должен быть минимальныйразмер страницы, чтобы мы в принципе смогли захватить всю физически доступную память с одной стороны, и чтобы нам хватило хэндлов Smartheap (ну или как там идентификаторы страниц называются) чтобы всю эту память адресовать. Ну то есть - допустим smartheap может управлять не более чем 128 страницами (условно - точно надо в документации смотреть). Если у нас размер страницы - 1Мбайт и на компе 128 Мбайт оперативки - то все и так хорошо. А если оперативки - 2 Гбайта, то надо размер страницы увеличить до 16Мбайт. Ну в общем - примерно так.
Старый 30.06.2005, 11:45   #12  
mugz is offline
mugz
Участник
 
107 / 10 (1) +
Регистрация: 05.08.2004
спасибо.
Старый 30.06.2005, 12:10   #13  
Владимир Максимов_imported is offline
Владимир Максимов_imported
Участник
 
33 / 10 (1) +
Регистрация: 20.01.2004
2 fed
Я правильно понял: SmartHead не освобождает память, но позволяет работать со всей доступной памятью?

Я запустил один раз метод Global::SmartHeapMemorySizeUp() перед запуском моего класса и вылет из-за нехватки памяти прекратился!

Хотя использованная память по прежнему НЕ освобождается. Но теперь это уже не имеет значения. Проблема была в том, что вылет происходил тогода, когда физически, еще было куча свободной памяти (вылетала примерно при использовании 450МБ, когда было свободно еще около 800МБ)

Всем спасибо. Данная проблема решена.
Старый 30.06.2005, 13:47   #14  
komar is offline
komar
Шаман форума
Аватар для komar
Ex AND Project
 
5,571 / 600 (32) +++++++
Регистрация: 24.05.2002
Классная форма! Нужно было туда еще кнопку - "Свалить в кучу"

[attachment=223:attachment]
Миниатюры
Нажмите на изображение для увеличения
Название: Куча.JPG
Просмотров: 539
Размер:	30.5 Кб
ID:	9809  
__________________
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  
Владимир Максимов_imported is offline
Владимир Максимов_imported
Участник
 
33 / 10 (1) +
Регистрация: 20.01.2004
На всякий случай:

Использование Global::SmartHeapMemorySizeUp() приводит к очень неприятным последствиям.

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

Впрочем, в моем случае это не принципиально. Я могу просто перезагрузить свою копию AXAPTA после выполнения нужного метода. Но использовать его в рабочем приложении не рекомендуется
Старый 01.07.2005, 11:40   #16  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,895 / 5650 (194) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
Начиная с Axapta 3.0 sp2 (кажется - sp2), smartheapMemorySizeUp вызывается при запуске приложения в классе Info::startup(). Правда - в этом самом sp2 произошел переход на новую версию smartheap library (с 4.01 на 6.01). Так что, скорее всего, та проблема о которой пишет Владимир Максимов, специфична для старых версий Axapta (точнее старых версий smartheap)
Теги
управление памятью

 


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 04:42.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.