美文网首页程序员
Lua base collectgarbage()

Lua base collectgarbage()

作者: AlbertS | 来源:发表于2016-08-23 19:23 被阅读2505次
垃圾回收.jpg

前言#

今天的函数涉及到垃圾回收机制,是lua中很重要的一部分,这是c/c++所不具备的功能,为今天我们就总结一下这个函数的简单用法,更高难度的用法大家可以根据定义自己尝试一下。

内容#


collectgarbage ()##

  • 原型:collectgarbage ([opt [, arg]])
  • 解释:这个函数是垃圾回收机制的一个通用接口,根据它的第一个参数opt会展现出不同的功能,具体解释如下:
  • "collect":执行一个完整的垃圾回收周期,这是一个默认的选项。
  • "stop":停止垃圾收集器(如果它在运行)。
  • "restart":将重新启动垃圾收集器(如果它已经停止)。
  • "count":返回当前使用的的程序内存量(单位是Kbytes)。
  • "step":执行垃圾回收的步骤,这个步骤的大小由参数arg(较大的数值意味着较多的步骤)以一种不特定的方式来决定,如果你想控制步骤的大小,你必须实验性的调整参数arg的值,如果这一步完成了一个回收周期则函数返回true
  • "setpause":给参数arg设置一个新值,用于设置回收器的暂停参数,并返回原来的暂停数值。
  • "setstepmul":给参数arg设置一个新值,用于设置回收器的步进乘数,并返回原来的步骤的值。

usage##

  • 首先我们新建一个文件将文件命名为collectgarbagetest.lua然后编写代码如下:
local x = 1
local y = 2
local z = 3;
-- 先统计现有内存使用情况
local mem1 = collectgarbage("count")
print("\ninit memory is", mem1, "kb")

-- 申请一些内存
local local_list = {}
for i=1,100 do
    local v = {}
    for i=1,10 do
        table.insert(v, i* 6)
    end
    table.insert(local_list, v)
end

local mem2 = collectgarbage("count")
print("\nafter apply memory is", mem2, "kb")

-- 内存回收
collectgarbage("collect")

-- 检查回收完的内存
local mem3 = collectgarbage("count")
print("\nafter collect memory is", mem3, "kb")

local_list = nil

-- 再次内存回收
collectgarbage("collect")

-- 检查回收完的内存
local mem4 = collectgarbage("count")
print("\nafter collect again memory is", mem4, "kb")
  • 运行结果
base_collectgarbage.png

总结#

  • Lua使用增量标记和使用两个数字来控制其垃圾回收周期即利用垃圾收集暂停数字和垃圾收集器的步进乘数来控制回收机制。
  • 由所给的例子可以看出当local_list被设置成nil时,函数的回收机制才生效,其实如果出了参数的作用域,垃圾回收也是会生效的。
  • 选项setpause的使用方法:collectgarbage("setpause", 200),表示当收集器在总使用内存数量达到上次垃圾收集时的两倍时再开启新的收集周期。
  • 选项setstepmul的使用方法:collectgarbage("setstepmul", 200),表示垃圾收集器的运行速度是内存分配的2倍,如果此值小于100可能会导致垃圾回收不能形成完整的周期。
  • 既然垃圾回收可以节省内存,是不是在lua中频繁调用函数collectgarbage()会提高性能?实践表明,反复垃圾回收反而会明显降低性能。
  • 其实不仅是lua,很多语言都是这样的,而lua的增量式gc在大部分时候都工作的很好。除了界面切换等将要发生大量资源载入的时候,否则还是尽量不要去手动回收比较好。

相关文章

  • Lua base collectgarbage()

    前言# 今天的函数涉及到垃圾回收机制,是lua中很重要的一部分,这是c/c++所不具备的功能,为今天我们就总结一下...

  • cocos2dx内存篇

    1、lua collectgarbage("setpause", 100) 2、cocos图片缓存 local t...

  • Lua 垃圾回收

    collectgarbage("collect"):执行垃圾回收的一个完整周期。 collectgarbage("...

  • Lua base tonumber()

    前言 重新开始更新的第一天,我们来聊一个轻松一点的函数,tonumber()这是个将指定参数转换成数字的函数,利用...

  • Lua base type()

    前言 今天学习的这个函数在lua中绝对很常用,用来查询当前变量是什么类型,有点反射机制的意思。那么知道变量是什么类...

  • Lua base tostring()

    前言 前面一篇文章我们介绍了把参数转换成数字的函数,今天来看一个把参数转换成字符串的函数,话说这个函数我在写lua...

  • Lua base setfenv()

    前言 今天来这个函数是用来设置当前运行环境的,也就是和我们之前讲过的getfenv函数是相关的,当时在学习getf...

  • Lua base select()

    前言 今天这个函数看到的时候,第一印象就是想到了c语言中大名鼎鼎的select函数,因为他们函数名是一样的,并且l...

  • Lua base setmetatable()

    前言 记得原来我们总结过一个查询元表的函数getmetatable(), 但是有查询必然会有设置,今天我们就一起来...

  • Lua base pcall()

    前言 作为苦逼的程序猿大周末的时候也必须不能忘记学习,今天我们来看一个调用其他函数的函数,这个函数其实就是给其他函...

网友评论

    本文标题:Lua base collectgarbage()

    本文链接:https://www.haomeiwen.com/subject/hjjnsttx.html