|
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 гига оперативы, но всегда тянул небольшое количество юзеров, а то прям захлебнулся бедняга, чую еще сырого много!
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |