我有一个创建全局数组的代码,当我取消设置数组时,内存仍然很忙。
我曾在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
答案 0 :(得分:1)
在许多用Tcl和其他语言编写的程序中,过去的内存使用情况可以很好地指示将来的内存使用情况。因此,作为一种一般的启发式方法,Tcl的实现不会尝试将内存返回给OS(如果需要,它可以始终将其分页; OS始终由负责)。确实,每个线程实际上都有自己的内存池(允许内存处理在很大程度上是无锁的),但这在只有一个主线程的情况下并没有多大区别(在后台您通常可以忽略一些工人) )。另外,内存池将趋于整体化,因为这样可以更快地工作。
无论使用什么工具进行测量,如果完全使用Tcl外部的工具,由于池的工作方式,它将无法提供特别好的真实内存使用情况跟踪。 Tcl的内部工具(memory
命令)提供了更准确的信息,但默认情况下不存在:它们是构建Tcl库时的编译时选项,通常会被关闭,因为它们具有很多的开销。另外,在Windows上,如果您构建控制台应用程序,则其中某些功能根本无法使用(这是实现方式的结果)。