Имя: Пароль:
1C
 
Утечки памяти в 1с
0 Impuls20_03
 
12.04.16
11:52
Добрый день эксперты. Столкнулся с проблемой утекания памяти в 1с. Сперва я грешил на свою хроническую криворукость, но после сокращения примера до минимума пришел к выводу что дело не совсем во мне.
В общем суть проблемы:
Каждые 10 секунд создается несколько фоновых заданий. В каждом фоновом задании создается HTTPСоединение до сайта, который отдает данные в JSON. Далее с помощью ЧтениеJSON ответ парсится и передается в форму с помощью ПоместитьВоВременноеХранилище, которая и отображает результат. Помещаются данные каждый раз по одному и тому же адресу. Собственно схема мутная но работает и, на время запросов, не вешает основной поток программы. Проблема в том, что 1с-ка медленно но верно отжирает память у системы пока не сожрет ее полностью. Проблема усугубляется еще и тем, что через какое-то время (когда сожрется примерно 500Мб памяти) начинает люто тормозить и интерфейс, а процессор загружается на 100%. Дальше больше. Закрываем форму - память не кушается, но и старая память не освобождается. Открываем фору - память продолжила течь.

Собственно начал упрощать проблему, которая свелась вот к такому:
На форме две кнопки. Одна вызывает сервеную процедуру с параметром, другая без параметра. И в том и в другом случае память течет, но течет с разной скоростью (с параметром быстрее), и 1с-ка эту отожранную память повторно не использует.

&НаКлиенте
Процедура ТестВызоваСервернойПроцедурыСПараметром(Команда)
    
    тест = новый Соответствие;
    для п=1 по 100 цикл
        ТЗ = новый Массив;
        ГСЧ = Новый ГенераторСлучайныхЧисел();
        для н=1 по 1000 цикл
            ТЗ.Добавить(ГСЧ.СлучайноеЧисло(0, 1000000000));
        КонецЦикла;
        тест.Вставить("q"+Строка(п), ТЗ);
    КонецЦикла;
    
    Сообщить("Стартуем");    
    для п=1 по 20 цикл
        ТестВызоваСервернойПроцедурыСПараметромНаСервере(тест);
    КонецЦикла;
    Сообщить("Готово");    
    
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ТестВызоваСервернойПроцедурыСПараметромНаСервере(стр)
    
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ТестВызоваСервернойПроцедурыНаСервере()
    // Вставить содержимое обработчика.
КонецПроцедуры

&НаКлиенте
Процедура ТестВызоваСервернойПроцедуры(Команда)
    для п=1 по 20000 цикл
        ТестВызоваСервернойПроцедурыНаСервере();
    КонецЦикла;
КонецПроцедуры


И, если в текущем варианте память течет медленно, то в моем варианте с фоновыми заданиями 1с-ка перестает подавать признаки жизни уже на 5-й минуте полета. Забыл сказать. Проверял на самой свежей на текущий момент: 1С:Предприятие 8.3 (8.3.7.2008). Собственно буду ждать любых предложений как можно побороть данную проблему, или где я косякнул.
1 Fragster
 
гуру
12.04.16
11:55
серверные процедуры пустые?
2 пипец
 
12.04.16
11:58
3 Impuls20_03
 
12.04.16
12:09
В тестовом варианте серверные процедуры пустые. В моем естественно что нет.
4 nordbox
 
12.04.16
12:22
Impuls20_03, хочешь по развлекаться??
сделай форму, можешь даже обычную, сделай пустую процедуру какую нибудь
и поставь ее вызов в Процедуру ОбновлениеОтображения
этой формы
Понаблюдай за загрузкой проца и памятью
))
5 Impuls20_03
 
12.04.16
12:25
Кстати. По истине чудесный форум. Вот только тему создал - так сразу все стало работать нормально. Видимо ЦМС сайта разработана с использованием экстракта подорожника.

Правда я теперь вообще ничего не понимаю. 20 минут назад память текла безбожно и за 1000 серверных вызовов все ложилось. А теперь все работает.
Конечно память потихоньку испаряется, но уже не так как было. В конфе ничего не менял))) Прям загадка.

to nordbox. Таки это ненормальное поведение, или вы указываете что я где-то сильно касячу?
6 nordbox
 
12.04.16
12:28
(5) Я не говорю что ты косячишь,
я говорю то что есть, то с чем я сталкивался
7 Fragster
 
гуру
12.04.16
12:35
вот такую обработку запустил (без отладки), за 10 минут, вроде, ничего не утекло

&НаКлиенте
Процедура ПриОткрытии(Отказ)
    ПодключитьОбработчикОжидания("ДергаемСерверБезКонтекста", 0.1, Истина);
КонецПроцедуры

&НаКлиенте
Процедура ДергаемСерверБезКонтекста()
    ДергаемСерверБезКонтекстаНаСервере();
    ПодключитьОбработчикОжидания("ДергаемСерверБезКонтекста", 0.1, Истина);
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ДергаемСерверБезКонтекстаНаСервере()
    // Вставить содержимое обработчика.
КонецПроцедуры
8 mingw
 
12.04.16
12:42
(5) Лучше просто не знать как работает garbage collector. Особенно когда много физической памяти. Легче жить будет.
9 Impuls20_03
 
12.04.16
12:50
(7) Попробовал. Так не течет. А если вызывать 20000 раз из одной процедуры то течет:
для п=1 по 20000 цикл
    ТестВызоваСервернойПроцедурыНаСервере();
КонецЦикла;
10 Fragster
 
гуру
12.04.16
12:57
(9) каждый раз при нажатии на кнопку, или один раз утекает и фиксируется?
11 Impuls20_03
 
12.04.16
13:28
(10) В том то и дело что каждый раз при нажатии. После отработки процедуры память тоже не сбрасывается. А после повторного вызова память начинает прибавляться к уже накопленной.
12 mingw
 
12.04.16
13:32
(11) Поиграйся в тестах с разными режимами запуска 1С (Толстый/Тонкий) и обязательно запускать режим Предприятия не через отладку из Конфигуратора.
13 Broadbread
 
12.04.16
13:34
(0) Yes it can
14 Impuls20_03
 
12.04.16
13:55
(12) Да. Действительно. В толстом клиенте с памятью все ОК.
15 mingw
 
12.04.16
14:03
(14) Зато некоторые конфы в толстом глючат. К примеру Розница 2.2 при запуске в толстом открытие элементов справочников из реквизитов документов по "Открыть (Ctrl+Shift+F4)"
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший