|
Что в памяти тебе моей... | ☑ | ||
---|---|---|---|---|
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
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |