找回密码
马上加入

QQ登录

只需一步,快速开始

搜索
发新帖

0

收听

2

听众

108

主题
发表于 2024-6-20 22:39:13 | 查看: 233| 回复: 0
Lua 基础教学:第八篇垃圾回收机制
在本篇文章中,我们将探讨 Lua 中的垃圾回收机制。垃圾回收是自动管理内存的过程,通过回收不再使用的内存来防止内存泄漏。
什么是垃圾回收?
垃圾回收(Garbage Collection,简称 GC)是一种自动内存管理机制,用于回收不再使用的内存。在 Lua 中,垃圾回收采用标记-清除(Mark-and-Sweep)算法。
Lua 的垃圾回收机制
Lua 的垃圾回收器负责回收动态分配的对象,例如表、函数、用户数据等。Lua 使用自动内存管理机制,这意味着程序员不需要手动释放内存。
标记-清除算法
标记-清除算法分为两个阶段:
  • 标记阶段:遍历所有可访问的对象,并将它们标记为活跃对象。
  • 清除阶段:遍历所有对象,回收未标记为活跃的对象。

控制垃圾回收
Lua 提供了一些函数来控制垃圾回收器的行为,这些函数在 collectgarbage 函数中定义。
手动触发垃圾回收
可以使用 collectgarbage 函数手动触发垃圾回收:
collectgarbage("collect")设置垃圾回收的步长
可以使用 collectgarbage 函数设置垃圾回收的步长。步长是一个影响垃圾回收器速度的参数。
collectgarbage("setstepmul", 200)获取内存使用情况
可以使用 collectgarbage 函数获取当前 Lua 状态下使用的内存量:
local mem = collectgarbage("count")
print("Memory used (in KB): " .. mem)示例:垃圾回收的影响
我们来看一个简单的示例,观察垃圾回收对内存使用的影响:
-- 创建大量表对象
local tables = {}
for i = 1, 10000 do
    tables = {i}
end

-- 查看内存使用情况
print("Memory before GC: " .. collectgarbage("count") .. " KB")

-- 删除表对象
for i = 1, 10000 do
    tables = nil
end

-- 手动触发垃圾回收
collectgarbage("collect")

-- 查看内存使用情况
print("Memory after GC: " .. collectgarbage("count") .. " KB")弱引用表
Lua 支持弱引用表,弱引用表中的对象不会阻止垃圾回收。弱引用表在缓存和映射等场景中非常有用。
创建弱引用表
使用 setmetatable 函数可以创建弱引用表。弱引用表有三种类型:弱键表、弱值表和弱键弱值表。
  • 弱键表

local weakKeys = setmetatable({}, {__mode = "k"})
  • 弱值表

local weakValues = setmetatable({}, {__mode = "v"})
  • 弱键弱值表

local weakKeysValues = setmetatable({}, {__mode = "kv"})示例:弱引用表
我们来看一个弱引用表的示例:
local cache = setmetatable({}, {__mode = "v"})  -- 弱值表

function createObject(value)
    local obj = {data = value}
    cache[value] = obj
    return obj
end

local obj1 = createObject(1)
local obj2 = createObject(2)

print(cache[1])  -- 输出:table: 0x...
print(cache[2])  -- 输出:table: 0x...

obj1 = nil  -- 解除对 obj1 的引用

-- 手动触发垃圾回收
collectgarbage("collect")

print(cache[1])  -- 输出:nil,因为 obj1 被垃圾回收
print(cache[2])  -- 输出:table: 0x..., 因为 obj2 仍然有引用总结
在这篇教程中,我们介绍了 Lua 的垃圾回收机制。我们学习了如何手动控制垃圾回收,观察了垃圾回收对内存使用的影响,并了解了弱引用表的概念和应用。垃圾回收是 Lua 中非常重要的内存管理机制,有助于自动化内存管理,防止内存泄漏。在接下来的教程中,我们将探讨 Lua 的调试和性能优化技巧。
继续关注我们的 Lua 教程系列,如果你有任何问题或建议,请在评论区留言。
Happy Coding!


Lua 基础教学:第九篇【调试与性能优化】
您需要登录后才可以回帖 登录 | 马上加入

QQ|Archiver|手机版|小黑屋|alg阿灵戈社区 ( 苏ICP备2023026137号-1|苏ICP备2023026137号-1 )

GMT+8, 2025-3-13 03:11 , Processed in 0.609568 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表