Оперативная память в TCL - PullRequest
0 голосов
/ 29 апреля 2019

У меня есть код, который создает глобальный массив, и когда я сбрасываю массив, память все еще занята.

Я пробовал в Windows с TCL 8.4 и 8.6

console show

puts "allocating memory..."

update

for {set i 0} {$i < 10000} {incr i} {
 set a($i) $i
}

after 10000

puts "deallocating memory..."

update

foreach v [array names a] {
 unset a($v)
}

after 10000

exit

1 Ответ

1 голос
/ 29 апреля 2019

Во многих программах, написанных на Tcl и на других языках, использование памяти в прошлом является довольно хорошим показателем использования памяти в будущем. Таким образом, как общая эвристика, реализация Tcl не пытается вернуть память в ОС (она всегда может выгрузить ее, если захочет; ОС всегда отвечает). Действительно, каждый поток на самом деле имеет свой собственный пул памяти (что позволяет обрабатывать память в значительной степени без блокировок), но это не имеет большого значения здесь, где есть только один основной поток (и несколько рабочих за кулисами, которые вы обычно можете игнорировать ). Кроме того, пулы памяти будут иметь тенденцию перераспределяться, потому что так работать намного быстрее.

Независимо от того, что вы измеряете, если это вообще инструмент, внешний по отношению к Tcl, он не обеспечит особенно хорошее отслеживание реального использования памяти из-за способа работы пула. Внутренние инструменты Tcl для этого (команда memory) предоставляют гораздо более точную информацию, но не доступны по умолчанию: они используются во время компиляции при сборке библиотеки Tcl и обычно отключаются, поскольку имеют * 1004. * много накладных расходов. Кроме того, в Windows некоторые их функции работают вообще, только если вы создаете консольное приложение (следствие того, как они реализованы).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...