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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 23.07.2012, 10:28   #1  
_AxDevel_ is offline
_AxDevel_
Участник
 
69 / 12 (1) ++
Регистрация: 20.08.2008
Адрес: Ижевск-Москва
? Книга продаж/покупок
Dynamics AX 4.0, ядро 4.0.2501.116
Запускаю обновление книги продаж. Процесс выполняется долго, это все знают. При расчёте запускаются классы семейства BookDataCalc*, которые выполняются на сервере. В классах создаётся много cherneh в памяти: set-ы, map-ы, recordsortedlist-ы и т.п. Так вот этот серверный код потихоньку начинает съедать память, после выполнения память не вся освобождается. Интересует вопрос такой: если разорвалась связь клиент-сервер, или возникла ошибка при серверном расчёте, то как сборщик мусора обрабатывает такую ситуацию для освобождения выделенной памяти? Пока лечится рестартом аоса. Очень актуально.
Старый 23.07.2012, 11:58   #2  
samolalex is offline
samolalex
Участник
Аватар для samolalex
Самостоятельные клиенты AX
 
259 / 107 (4) +++++
Регистрация: 18.06.2010
Адрес: Москва
Обсуждение принципов работы "сборщика мусора" велось здесь
ИМХО. По поводу, данной ситуации, приходят на ум такие варианты как:
1) Очистка кэша (сервис->очистка кэша или удаление файлов *.aoc)
2) Запуск операции в системе с двухуровневым вариантом архитектуры;
3) Запуск операции на сервере посредством удаленного подключения.
__________________
С уважением, Александр.
Старый 23.07.2012, 15:14   #3  
_AxDevel_ is offline
_AxDevel_
Участник
 
69 / 12 (1) ++
Регистрация: 20.08.2008
Адрес: Ижевск-Москва
Цитата:
Сообщение от samolalex Посмотреть сообщение
Обсуждение принципов работы "сборщика мусора" велось здесь
ИМХО. По поводу, данной ситуации, приходят на ум такие варианты как:
1) Очистка кэша (сервис->очистка кэша или удаление файлов *.aoc)
2) Запуск операции в системе с двухуровневым вариантом архитектуры;
3) Запуск операции на сервере посредством удаленного подключения.
Вы предлагаете лечить симптомы, а не причины.
Старый 23.07.2012, 17:43   #4  
samolalex is offline
samolalex
Участник
Аватар для samolalex
Самостоятельные клиенты AX
 
259 / 107 (4) +++++
Регистрация: 18.06.2010
Адрес: Москва
Из этого сообщения:
Цитата:
Объект считается неиспользуемым, если счетчик указателей на этот объект стал равен 0.
Поэтому, скорее всего, при разрывах связи счетчики указателей на неиспользуемые объекты не сбрасываются. Поэтому в этой ситуации следует каким-либо образом в случае возникновения ошибки очищать неиспользуемую память посредством метода shrinkPool() класса HeapCheck, предназначенного для управления памятью в Аксапта.
Таким образом, мне кажется, для устранения вышеуказанной проблемы можно реализовать конструкцию вроде этой:
X++:
    HeapCheck   hc;

    try
    {
        //Операция обновления книги продаж
    }
    catch(Exception::Error)
    {
        hc.shrinkPool();
        //...
    }
__________________
С уважением, Александр.
Старый 24.07.2012, 09:19   #5  
_AxDevel_ is offline
_AxDevel_
Участник
 
69 / 12 (1) ++
Регистрация: 20.08.2008
Адрес: Ижевск-Москва
Цитата:
Сообщение от samolalex Посмотреть сообщение
Из этого сообщения:

Поэтому, скорее всего, при разрывах связи счетчики указателей на неиспользуемые объекты не сбрасываются. Поэтому в этой ситуации следует каким-либо образом в случае возникновения ошибки очищать неиспользуемую память посредством метода shrinkPool() класса HeapCheck, предназначенного для управления памятью в Аксапта.
Таким образом, мне кажется, для устранения вышеуказанной проблемы можно реализовать конструкцию вроде этой:
X++:
    HeapCheck   hc;

    try
    {
        //Операция обновления книги продаж
    }
    catch(Exception::Error)
    {
        hc.shrinkPool();
        //...
    }
У меня вот вопрос, кто отвечает за очистку памяти: винда, сама аксапта, CLR? При создании большого числа объектов с последующим их удалением получаем фрагментированную кучу на аосе. Может быть, это служит причиной роста занимаемой аосом памяти?
Старый 24.07.2012, 10:10   #6  
samolalex is offline
samolalex
Участник
Аватар для samolalex
Самостоятельные клиенты AX
 
259 / 107 (4) +++++
Регистрация: 18.06.2010
Адрес: Москва
Цитата:
У меня вот вопрос, кто отвечает за очистку памяти: винда, сама аксапта, CLR?
Насколько я понял из прочитанного в других темах, посвященных управлению памятью, в Axapta используется "сторонний" (т.е. используемый не только в Ax) менеджер управления памятью SmartHeap. Сайт производителя
Цитата:
При создании большого числа объектов с последующим их удалением получаем фрагментированную кучу на аосе. Может быть, это служит причиной роста занимаемой аосом памяти?
Может быть. Возможные варианты решения проблемы:
1) Попробуйте изменить критерий начала сборки мусора (Сервис\Параметры\Разработка\Критерий начала сборки мусора)
2) Сделайте дефрагментацию кучи через форму SysHeapCheck.
__________________
С уважением, Александр.

Последний раз редактировалось samolalex; 24.07.2012 в 10:13.
Старый 26.07.2012, 10:44   #7  
_AxDevel_ is offline
_AxDevel_
Участник
 
69 / 12 (1) ++
Регистрация: 20.08.2008
Адрес: Ижевск-Москва
Цитата:
Сообщение от samolalex Посмотреть сообщение
Насколько я понял из прочитанного в других темах, посвященных управлению памятью, в Axapta используется "сторонний" (т.е. используемый не только в Ax) менеджер управления памятью SmartHeap. Сайт производителя

Может быть. Возможные варианты решения проблемы:
1) Попробуйте изменить критерий начала сборки мусора (Сервис\Параметры\Разработка\Критерий начала сборки мусора)
2) Сделайте дефрагментацию кучи через форму SysHeapCheck.
1-2 - не помогло. Уточнение: класс BookDataCalc_Purch_Process_RU
Старый 26.07.2012, 12:06   #8  
_AxDevel_ is offline
_AxDevel_
Участник
 
69 / 12 (1) ++
Регистрация: 20.08.2008
Адрес: Ижевск-Москва
Цитата:
Сообщение от _AxDevel_ Посмотреть сообщение
1-2 - не помогло. Уточнение: класс BookDataCalc_Purch_Process_RU
там активно используется RecordSortedList в качестве буфера.
MSDN пишет так:
There is no limit to the size of a RecordSortedList object, but they are completely memory-based, so there are potential memory consumption problems.
Старый 27.07.2012, 10:40   #9  
_AxDevel_ is offline
_AxDevel_
Участник
 
69 / 12 (1) ++
Регистрация: 20.08.2008
Адрес: Ижевск-Москва
Цитата:
Сообщение от _AxDevel_ Посмотреть сообщение
там активно используется RecordSortedList в качестве буфера.
MSDN пишет так:
There is no limit to the size of a RecordSortedList object, but they are completely memory-based, so there are potential memory consumption problems.
Почему после завершения работы класса память, выделенная под объект RecordSortedList не возвращается в ОС? Проверил, ссылок на данный экземпляр RecordSortedList в процессе выполнения больше не остается. Таким образом при периодических запусках расчёта получаем разрастание используемой оасом памяти. Тестовый пример по заполнению RecordSortedList записями FactureJour_RU в количестве 100000 показал увеличение памяти, используемой аосом, при каждом запуске на 160 МБ.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Сопоставление невозможно из-за нарушения процедуры управления книгой продаж/покупок. maxkov DAX: Функционал 27 09.01.2015 12:20
Квартальные книга покупок, книга продаж DenWolf DAX: Функционал 10 08.10.2008 09:11
Книга покупок и авансы denistim DAX: Функционал 1 12.10.2005 11:42
Проводка предоплаты в книге продаж и книге покупок aevi82 DAX: Функционал 4 23.06.2005 16:35
Книга продаж eremite DAX: Функционал 6 07.04.2004 07:23

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

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

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