Имя: Пароль:
1C
1С v8
1С 8.3 жрет память
0 alexei366
 
27.06.13
15:06
Есть у меня форма, на ней кнопка, действие выполняется на клиенте, грузится картинка с диска, далее во временное хранилище и в реквизит строка, который отображается как поле картинки. Также перед покладкой во врем хранилище я его сначала очищаю.
В итлге жмем на кнопу 100 раз, в диспетчере задач наша 1С уже щанимает около 500 МБ, закрываем форму а память не освобождается.

В чем трабла, что не так я делаю?
1 fmrlex
 
27.06.13
15:08
(0) А 8.2 как себя ведет?
2 alexei366
 
27.06.13
15:10
(1) Не пробывал, думаю также если по приведенному примеру
3 ДенисЧ
 
27.06.13
15:11
1с жрёт память, а вы кактусы...
4 arsik
 
гуру
27.06.13
15:11
(0) А бубен? Бубен то тряс?
5 Gorgol
 
27.06.13
15:13
(0) Если на клиенте много свободной памяти, то почему бы и нет. Попробуй сделать это же в виртуалке, где памяти у всех приложений будет 200 метров.
6 fmrlex
 
27.06.13
15:13
(2) Ну дык попробуй. Запусти под 8.2 свое поделие.
7 Лефмихалыч
 
27.06.13
15:15
Сердитый мужик в аптеке: Ваши презервативы рвутся!
Голос из очереди: А еще мнутся и гнутся...

ЗЫ вы как-то не так и не то делаете просто
8 alexei366
 
27.06.13
15:15
(5) Так чо теперь пусть хоть 2 Гига занимает, чтоб картинки полистать из каталога? этож бред
9 alexei366
 
27.06.13
15:15
(7) Так давай скажи как правильно, яж этого и хочу
10 pmb
 
27.06.13
15:17
(0) картинка - двоичные данные? Переменная в которую грузиться картинка не очищается
11 alexei366
 
27.06.13
15:17
Корочь, если не ложить получаемый адрес хранилища в реквизит (то есть не выводить картинку), то память жрется соответствующая размеру картинки помноженному на 10 наверно, но не на 500 как в случае если выводить
12 alexei366
 
27.06.13
15:18
(10) Это локальная переменная функции
13 pmb
 
27.06.13
15:19
(12) она и не очищается. Очисть ее явно в конце процедуры
14 H A D G E H O G s
 
27.06.13
15:19
Расслабтесь.
Потом, когда дойдет до 800 метров - она тупо не будет отображать новые картинки, а потом через пару десятков секунд сбросит память до 50 метров.
15 Fragster
 
гуру
27.06.13
15:20
мусорщик 1с ну очень не любит циклические ссылки
16 Fragster
 
гуру
27.06.13
15:20
хз, как в 8.3, может бага, но вообще - в техножурнале можно отследить, на каких конкретно строчках и переменных течет.
17 alexei366
 
27.06.13
15:22
(15) Что ты конкретно имел ввиду
18 pmb
 
27.06.13
15:22
(16) как это сделать? События LEAKS и MEM только для сервера выводятся (по крайней мере в 8.2)
19 pmb
 
27.06.13
15:22
(17) покажи код модуля
20 alexei366
 
27.06.13
15:27
(19) Держи



&НаКлиенте
Перем ПолеКартинку2;


&НаКлиенте
Процедура Тест(Команда)

Если Не (ПолеКартинку = "") Тогда
       УдалитьИзВременногоХранилища(ПолеКартинку2);
   КонецЕсли;

   ПолеКартинку2 = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные("C:\12\jpg.jpg"), ЭтаФорма.УникальныйИдентификатор);


КонецПроцедуры
21 pmb
 
27.06.13
15:28
попробуй так

а = Новый ДвоичныеДанные("C:\12\jpg.jpg");
ПолеКартинку2 = ПоместитьВоВременноеХранилище(а, ЭтаФорма.УникальныйИдентификатор);

а = Неопределено;
22 alexei366
 
27.06.13
15:34
(21) Ну пипец, в натуре работает, типа "а = Неопределенно" эт у нас а.Dispose() в c#.
Я то думал оно должно какнить само раз объявленно в рамках функции, да и при закрытии тож нифига блин
23 alexei366
 
27.06.13
15:34
(21) Ща попробую с выводом картинки
24 Asmody
 
27.06.13
15:42
(21) вот такой в 1Ске х.вый сборщик мусора
25 hhhh
 
27.06.13
15:44
(22) если написал

ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные("C:\12\jpg.jpg")

значит поместил во временное хранилище. Значит, не должна эта память освобождаться. ВСё правильно делает.
26 Asmody
 
27.06.13
15:45
(25) а вот тут должна? УдалитьИзВременногоХранилища(ПолеКартинку2)
27 Fragster
 
гуру
27.06.13
15:47
(18) на клиенте тоже есть техножурнал, только тссс!
28 alexei366
 
27.06.13
15:49
(25) А метод удалить ты не видел в моем коде?
29 Фрэнки
 
27.06.13
15:50
(28)
Если Не (ПолеКартинку = "") Тогда
       УдалитьИзВременногоХранилища(ПолеКартинку2);
   КонецЕсли;

что-то очень похоже, что условие забито криво. ПолеКартинку
и ПолеКартинку2
это разные переменные
30 alexei366
 
27.06.13
15:51
Такс если выводить картинку, то он начинает на каждый щелчок по 50 метров жрать, но както всетаки потом очищает, кидает её периодически с 700 Метров до 200
31 alexei366
 
27.06.13
15:52
(29) Да знаю знаю, я потом исправил, принимай что условие верное было, оно вообще нужно чтоб первый раз с исключением не вылетело
32 pmb
 
27.06.13
15:52
(27) если честно то поиск утечек памяти в нем криво работает - выводит кучу событий, которые "потенциально" могут быть утечкой.
В то же время была похожая ситуация как у автора, так событие подобное
Новый ДвоичныеДанные("C:\12\jpg.jpg")
вообще не попало в журнал
33 alexei366
 
27.06.13
15:56
Ну вроде чуток понятно стало, с переменными в теле функции надо самому разбираться типа приравнивая их к Неопределенно, а с элементом формы сборщик мусора разбирается (Вроде так)
34 Фрэнки
 
27.06.13
15:59
(33) угу.
а вообще все на 7.7 еще началось. когда в любом маломальски критичном по памяти месте, при выходе из контекста считалось хорошим тоном выполнить А=0 , которое в 8-ке чаще всего заменяют на А=Неопределено.

По сути, это просто назначение нового указателя в памяти... Исходники надо смотреть, чтоб выводы делать, есть деструкторы объектов и как собирается мусор при выдаче переменной нового объекта. А=Неопределено это тоже операция, которая из-за преобразования типа тянет за собой деструктор для прежнего объекта и новый конструктор для текущего присвоения.
35 Фрэнки
 
27.06.13
16:02
И на элементы форм не сборщик мусора вешается, а автоматический вызов деструкторов при удалении родителя. Т.е. я к тому, что это не совсем настоящие сборщики.
36 alexei366
 
27.06.13
16:28
(35) Ну родитель у элемента это форма, а её я не закрываю
37 hhhh
 
27.06.13
16:33
(28) так ведь там бред написан

Если Не (ПолеКартинку = "") Тогда

причем ПОлеКартинку нигде не видно, что оно равно пробелу

поэтому я и не обратил внимание на это удалить, потому что оно выполнится с вероятностью 10%.
38 alexei366
 
27.06.13
16:48
(37) Это реквизит формы типа строка
39 alexei366
 
27.06.13
16:48
(37) И оно выполняется, я проверял
40 Фрэнки
 
27.06.13
17:04
(36) тогда это ответ на то, почему встроенная "сборка мусора" не работает.
41 Pilokarpios
 
27.06.13
18:50
(40) у меня IIS7 уже два раза упал когда я 1с83 насиловал!!! он у меня для тестов, всего 3 гига оперативы, но всегда тянул небольшое количество юзеров, а то прям захлебнулся бедняга, чую еще сырого много!