Имя: Пароль:
1C
1С v8
Что в памяти тебе моей...
,
0 H A D G E H O G s
 
30.09.13
12:15
День добрый.
Похоже, разобрался в механизме памяти.
1С использует механизм heap (CreateHeap, кучи, динамическая память) - надстройку операционки над плоской памятью (VirtualAlloc).

Куча используется не процессная, создаются свои, отдельные.

Что видим:
1) При создании гигантской строки:

ОписаниеТипа=Новый ОписаниеТипов("Строка",Новый КвалификаторыСтроки(1000000000,ДопустимаяДлина.Фиксированная));
СтрокаДанных=ОписаниеТипа.ПривестиЗначение(" ");

создается отдельная куча размером 2 Гб.

2) При удалении строки:
СтрокаДанных="";
СтрокаДанных=Неопределено;

созданная куча убивается

3) При создании гигантского табличного документа:

Макет=ПолучитьМакет("Макет");
Область=Макет.ПолучитьОбласть("test");
Пока Истина Цикл
ОбработкаПрерыванияПользователя();
ЭлементыФормы.ПолеТабличногоДокумента.Вывести(Область);
КонецЦикла;

создается толпа куч размером 16192 кб:
http://s020.radikal.ru/i721/1309/33/5c1f7b0f6f40.png

4) При очистки этого табличного документа:

ЭлементыФормы.ПолеТабличногоДокумента.Очистить();

эта созданная толпа куч не удаляется, а переводится из состояния commited в reserved (терминами virtualalloc, ну да ладно).
http://s03.radikal.ru/i176/1309/31/dccbc5fc9f15.png

Эффекты:
1) Диспетчер Windows видит, что память свободна.
2) При повторном выводе даже совершенно другого таб. дока. - эти зарезервированные кучи будут использованы (профит в скорости, но хз какой).
3) При попытке создания не таб. дока, а например, большой строки - эти кучи не использованы (вот где мякотка) и памяти может не хватить.
1 jsmith82
 
30.09.13
12:16
+100 в карму
2 Lionee
 
30.09.13
12:20
двести
3 H A D G E H O G s
 
30.09.13
12:22
Вопросы:
1) Насколько умен механизм куч Windows?
сможет ли
HeapAlloc() выделить мне 2 гига памяти, если его нет цельным блоком (dll там в срединке криворукая загрузилась)? И потом корректно с этим блоком работать, так как будто он единный (CopyMemory, ZeroMemory, e.t.c.)

VirtualAlloc (более нижкоуровневый) - не сможет, например.

2) Можно ли обойти выделенные кучи от 1С и сделать им HeapFree для unCommited блоков?
4 aka AMIGO
 
30.09.13
12:22
а при выходе из 1с, в ОП место, занимаемое кучей, действительно освобождается?
а то, помнится, писал я проги на СРР (или QC.. забыл уже) так там нужно было специально заботиться об уборке своей кучи..
5 Fragster
 
модератор
30.09.13
12:23
(0) мужик!
6 Fragster
 
модератор
30.09.13
12:24
а по сабжу - для больших строк давно перешел на ЗаписьXML.ЗаписатьБезОбработки()
7 Sammo
 
30.09.13
12:24
Насколько я помню решалось присвоением табличному документу Неопределено. Но зуб не дам - было на 8.1 и года 3 назад что-то похожее...
8 Sammo
 
30.09.13
12:25
(4) Теоретически освобождается. Но не всегда. Надо смотреть утечки.
9 Кирпич
 
30.09.13
12:25
мне не интересно, как 1с умудряется сжирать всю память. мне интересно, когда же это млять кончится.
10 XLife
 
30.09.13
12:26
(0) продолжайте наблюдения...
11 aka AMIGO
 
30.09.13
12:26
(9) никогда. 1с это неинтересно
12 H A D G E H O G s
 
30.09.13
12:28
(3) Пока я пытался весь этот зоопарк обойти через

1) CreateToolhelp32Snapshot()
2) HeapWalk

Но мне не удается добраться до адресов блоков, которые reserved

Даже так:

HeapWalk - дает регион, а затем мильены блоков размерами от 40 байт до 10000 байт (и это верно, объектов много и они малые), а vmmap от Руссиновича показывает 2 региона - используемую и резервируемую память кучи.

Вот, по используемой памяти я спокойно прохожу через heapwalk, а до резервированной памяти она не доходит.
13 Fragster
 
модератор
30.09.13
12:30
кстати, кто-нибудь смотрел, почему долго висящая в фоне 1ска потом так мучительно медленно закрывается?
14 H A D G E H O G s
 
30.09.13
12:33
(13) Я с таким сталкивался, когда 1С закрывалась после работы с гиганским таб доком, отлаживаемая из под Дельфей.

p.s. Отладка 1С-ки из под Дельфи способна затормозить любой комп.
15 H A D G E H O G s
 
30.09.13
12:35
Рекомендую, кстати, скачать vmmap и посмотреть область Image 1С-ки.
Там. Есть. На что взглянуть.
16 mzelensky
 
30.09.13
12:35
(0) а можно тупой вопрос - нафейхуа ты все это затеял? Просто ради интереса?
18 H A D G E H O G s
 
30.09.13
12:37
(16) Иногда бывает нужно после вывода таб дока еще немного поработать в 1С без перезапуска процесса.
19 Fragster
 
модератор
30.09.13
12:39
с СКДшными табдоками такая же фигня?
20 H A D G E H O G s
 
30.09.13
12:39
гуру, расскажите мне про Heap. И про режим low-fragmentation heap.

А еще про функцию HeapCompact() - зачем она.

И как Руссинович добрался до региона Reserved
21 H A D G E H O G s
 
30.09.13
12:41
(19) Не смотрел.

Можно посмотреть, это дико просто.
http://technet.microsoft.com/en-us/sysinternals/dd535533
22 H A D G E H O G s
 
30.09.13
12:41
И ТаблицуЗначений можно глянуть.
23 ifso
 
30.09.13
12:42
(13) Сползает в своп, ну и ждешь, пока из свопа поднимется.
24 H A D G E H O G s
 
30.09.13
12:43
(22) Но скорее всего - она аналогична Таб.Доку - много куч под каждую строку - связный список.
25 H A D G E H O G s
 
30.09.13
12:48
нет. Не под каждую строку, также - кучи по 16 мегабайт.
И также они просто uncommited после очистки.

И также они будут использованы снова при использовании другой ТЗ.

И также большой блок под сырые данные не будет выделен, а это не только ТупоСтрока, но и XMLЗапись без привязки к файлу, к примеру.
26 H A D G E H O G s
 
30.09.13
12:48
И все таки (20)
27 samozvanec
 
30.09.13
12:54
гыгыгы
Если НЕ ПрограммистамПлатятВовремя Тогда

ОписаниеТипа=Новый ОписаниеТипов("Строка",Новый КвалификаторыСтроки(1000000000,ДопустимаяДлина.Фиксированная));
СтрокаДанных=ОписаниеТипа.ПривестиЗначение(" ");

КонецЕсли;
28 Fragster
 
модератор
30.09.13
12:56
(27) зря смеешься. иногда такие знания очень пригождаются
29 Fragster
 
модератор
30.09.13
12:58
(25) хз, код
Для Сч = 1 по 10000 цикл
Массив.Добавить(Новый ТабличныйДокумент);
КонецЦикла;

подвесил мне 1ску, выжрал 500мб в привэйт байтс.

после закрытия обработки - все вернулось на место.
30 samozvanec
 
30.09.13
13:00
(28) я лишь намекнул на разнообразие использования
31 Fragster
 
модератор
30.09.13
13:00
(29)+ поправка - size остался, committed вернулся
32 Fragster
 
модератор
30.09.13
13:01
и вот после такого фокуса 1ска после того, как убила окно, еще висит процессом
33 H A D G E H O G s
 
30.09.13
13:15
Кирпич, ну ты же должен знать про (20).
34 Кирпич
 
30.09.13
13:20
(33) не. я этой темой не интересовался. может когда на пенсию выйду..
35 Fragster
 
модератор
30.09.13
14:00