Memory 在这种情况下,调用collectgarbage(“count”)时,为什么lua堆内存会增长

Memory 在这种情况下,调用collectgarbage(“count”)时,为什么lua堆内存会增长,memory,lua,garbage-collection,Memory,Lua,Garbage Collection,运行以下lua代码: 收集垃圾(“收集”) 收集垃圾(“停止”) 局部a,b={},{} 本地m0=收集垃圾(“计数”) 本地m1=收集垃圾(“计数”) 本地m2=收集垃圾(“计数”) 本地m3=收集垃圾(“计数”) 本地m4=收集垃圾(“计数”) 打印(m0*1024) 打印(m1*1024) 打印(m2*1024) 打印(m3*1024) 打印(m4*1024) 我得到了这些: 23907.0 23907.0 23907.0 24515.0 24515.0 有Lua5.3和OSX Moj

运行以下lua代码:

收集垃圾(“收集”) 收集垃圾(“停止”) 局部a,b={},{} 本地m0=收集垃圾(“计数”) 本地m1=收集垃圾(“计数”) 本地m2=收集垃圾(“计数”) 本地m3=收集垃圾(“计数”) 本地m4=收集垃圾(“计数”) 打印(m0*1024) 打印(m1*1024) 打印(m2*1024) 打印(m3*1024) 打印(m4*1024) 我得到了这些:

23907.0
23907.0
23907.0
24515.0
24515.0
有Lua5.3和OSX Mojave

我不明白为什么在调用
collectgarbage(“count”)
三次后内存使用量会增加


谢谢。

运行
collectgarbage()
调用序列需要在全局环境的表中搜索该函数,并将其与字符串参数一起推送到堆栈上。 Lua正在将
collectgarbage
报告推送到VM状态的堆栈上

堆栈必须增长以适应新的值,并且根据堆栈的当前容量,可能只有足够的空间来允许在不重新分配堆栈的情况下执行所有这些操作,或者它必须扩展堆栈,从而提供不同的内存大小报告


在创建表之后,尝试在第一次调用
collectgarbage(“count”)
之前的行中插入
print“grab stats”
。很可能您根本看不到内存大小的变化。

每次打印都会将要打印的数字转换为字符串。这些新字符串需要内存。

collectgarbage(“count”)
返回一个数字,而不是字符串。只有在计算完所有
m0
m4
之后,这些数字才会转换为字符串。你说得对,我的错。在这种情况下,内存增长确实是由于堆栈重新分配造成的,在向堆栈中添加了更多的局部变量后,需要执行“collectgarbage”。
向堆栈中添加了更多的局部变量
-在执行区块之前,是否为VM寄存器(Proto.maxstacksize)分配了所有内存?