Lua学习笔记:浅谈对垃圾回收的理解

前言
本篇在讲什么

Lua的垃圾回收
本篇适合什么

适合初学Lua的小白
本篇需要什么

Lua语法有简单认知
依赖Sublime Text编辑器

本篇的特色

具有全流程的图文教学
重实践,轻理论,快速上手
提供全流程的源码内容


★提高阅读体验★

👉 ♠ 一级标题 👈

👉 ♥ 二级标题 👈

👉 ♣ 三级标题 👈

👉 ♦ 四级标题 👈


目录

  • ♠ 概述
  • ♠ 弱引用表
    • ♥ 示例
      • ♣ 弱引用键
      • ♣ 弱引用值
    • 在这里插入图片描述
  • ♠ 析构器
  • ♠ 垃圾收集器
    • ♥ 版本变化
  • ♠ 控制垃圾收集的步长
  • ♠ 推送
  • ♠ 结语


♠ 概述

Lua使用自动内存管理,用户可以创建对象,而不能删除对象,解放双手,不需要对内存进行管理

部分情况下需要我们主动辅助Lua去进行垃圾回收


♠ 弱引用表

弱引用的作用就是告诉GC,回收的时候不用考虑这一部分引用,弱引用通过弱引用表来实现

弱引用表通过元表的特殊字段__mode来定义,如下所示__mode设置为k则键是弱引用,值设置为v则表值为弱引用,设置为kv则键值都是弱引用

  • 键为弱引用的弱引用表
a = {}

mt = {__mode = "k"}
setmetatable(a, mt)
  • 值为弱引用的弱引用表
a = {}

mt = {__mode = "v"}
setmetatable(a, mt)
  • 键值均为弱引用的弱引用表
a = {}

mt = {__mode = "kv"}
setmetatable(a, mt)

♥ 示例

我们通过简单的例子来演示对于弱引用的垃圾回收


♣ 弱引用键

首先我们创建一个键为弱引用的表,如下述代码所示,我们简单分析一下

a = {}

mt = {__mode = "k"}
setmetatable(a, mt)

sKey    = {}
sValue  = {}

a[sKey] = sValue
sKey    = {}

-- collectgarbage()

#### <u><font color="#4B97AE" face="微软雅黑" ></font>
for i,v in pairs(a) do
    print(i,v)
end
#### <u><font color="#4B97AE" face="微软雅黑" ></font>
  • 表a通过设置元表mt变成了一个为弱引用的弱引用表
  • 定义了两个空表skeysValue,并表a设置了a[sKey] = sValue
  • 紧随其后去重置了空表sKey = {}

若果我们不设置弱引用表,垃圾回收对结果是没有影响的,表a内包含了以sKey为键,sValue为值的一组键值对

在这里插入图片描述

设置弱引用,执行不执行垃圾回收collectgarbage,输出是如下所示的

在这里插入图片描述

看结果很显然,设置键弱引用后,表a内的键值在手动垃圾回收后都被回收掉了,我们分析一下原因,重点在下图所示的位置

在这里插入图片描述

我们为表a设置了以skey为键的一组键值对后,随即对skey进行了一次重新赋值
第一个声明的表其实已经失去了引用,因为引用它的skey已经重新赋值,新声明的表,虽然都是空表,但从内存地址来说已经不是一个表了
所以在垃圾回收的时候,作为表a键的空表已经失去了除弱引用外的所有引用,那么它就会连带着值被一起回收

在这里插入图片描述


♣ 弱引用值

弱引用值和弱引用键是一样的,在值是弱引用的情况下,如果对应值已经失去了除弱引用外的所有引用,那么在垃圾回收执行后,就会连带着键一起被回收

在这里插入图片描述

注意:只有对象可以从弱引用表中被移除,而像数字和布尔这样的“值”是不可回收

在这里插入图片描述

♠ 析构器

析构器是一种与对象关联的函数,当该对象即将被回收时该函数会被调用

Lua通过元方法_gc实现析构器,如下例所示,在全局变量tbl失去引用被回收后,元方法__gc会被调用

tbl = {x ="oh shit 我无了!"} 

mt = {}
mt.__gc = function(tbl)
    print(tbl.x)
end
setmetatable(tbl, mt) 
tbl = nil

collectgarbage()

在这里插入图片描述

每一个对象的析构器都会精确运行一次如果一个对象直到程序运行结束还没有被回收,那么Lua语言就会在整个Lua拟机关闭后调用它的析构器

注意:元方法__gc是在Lua5.2版本才实现的内容


♠ 垃圾收集器

每一个垃圾收集周期由四个阶段组成:标记(mark)、清理(cleaning)、清除(sweep)和析构(finalization)

  • 标记阶段

根结点集合标记为活跃,根结点集合由Lua语言可以直接访问的对象组成,这个集合只包括注册表,当所有能标记活跃的对象标记完后,标记结束

  • 清理阶段

在这个阶段处理析构器和弱引用表
首先,Lua找到所有需要被析构的对象,标记为复苏状态单独存放
然后,Lua遍历弱引用表并从中移除键或值未被标记的元素

  • 清除阶段

遍历所有对象如果一个对象没有被标记为活跃,则会被清理,之后会清除所有标记,等待下一个一个回收周期

  • 析构阶段

Lua语言调用清理阶段被标记为复苏状态的对象的析构器


♥ 版本变化

在5.1版本之前的垃圾回收会停止主程序,待回收结束再恢复,5.1之后使用了增量式垃圾收集器,不在需要停止主程序

为了保证垃圾收集器的正确性,垃圾收集器中的有些操作具有发现危险改动和纠正所涉及对象标记的内存屏障

Lua5.2引入了紧急垃圾收集当内存分配败时,Lua会强制进行一次完整的垃圾收集 ,然后再次尝试分配


♠ 控制垃圾收集的步长

通过函数collectgarbage可以对垃圾收集器进行一些额外的控制,该函数实际上是几个函数的集合体,通过传递不同参数会有不通效果

参数功能
“stop”停止垃圾收集器,直到使用参数restart再次调用collectgarbage
“restart”重启垃圾收集器
“collect”执行一次完整的垃圾回收,默认这个
“step”执行某些垃圾收集工作
“count”kb为单位返回当前已用内存数
“setpause”控制在一次收集完成后, 多久再开始新的一次回收
“setstepmul”控制对于每分配1KB内存,垃圾收器应该进行多少工作

♠ 推送

  • Github
https://github.com/KingSun5

♠ 结语

若是觉得博主的文章写的不错,不妨关注一下博主,点赞一下博文,另博主能力有限,若文中有出现什么错误的地方,欢迎各位评论指摘。

👉 本文属于原创文章,转载请评论留言,并在转载文章头部著名作者出处👈

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/35078.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

3、boostrap图片视频上传展示

boostrap图片视频上传展示 1、展示效果2、html代码 1、展示效果 项目目录结构 2、html代码 html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><!--<link rel"st…

记一次 .NET 某工控视觉系统 卡死分析

一&#xff1a;背景 1. 讲故事 前段时间有位朋友找到我&#xff0c;说他们的工业视觉软件僵死了&#xff0c;让我帮忙看下到底是什么情况&#xff0c;哈哈&#xff0c;其实卡死的问题相对好定位&#xff0c;无非就是看主线程栈嘛&#xff0c;然后就是具体问题具体分析&#x…

一起来看看文档翻译哪个好吧

在繁忙的都市生活中&#xff0c;小玲是一位年轻的职场人士。她的工作经常需要处理各种文档和文件&#xff0c;而其中不乏需要与外国合作伙伴交流的时候。然而&#xff0c;她并不熟悉其他语言&#xff0c;这给她的工作带来了一定的困扰。于是&#xff0c;她开始寻找免费的文档翻…

什么是AOP?

目录 一、AOP简介 1、AOP简介和作用 2、AOP的概念 二、AOP的基本实现 三、AOP工作流程 1 、AOP工作流程 2、AOP核心概念 四、AOP切入点表达式 1、语法格式 2、通配符 五、AOP通知类型 1、AOP通知分类 2、AOP通知详解 &#xff08;1&#xff09;前置通知 &#xf…

MySQL-分库分表详解(四)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️努力不一定有回报&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xf…

【ArcGIS微课1000例】0069:用ArcGIS提取一条线的高程值

本实验讲解用ArcGIS软件,基于数字高程模型DEM提取一条线的高程值并导出。 文章目录 一、加载实验数据二、将线转为折点三、提取折点高程值四、导出高程值五、注意事项【相关阅读】:【GlobalMapper精品教程】060:用dem提取一条线的高程值 一、加载实验数据 本实验使用的数据…

初学者一步步学习python 学习提纲

当学习Python时&#xff0c;可以按照以下提纲逐步学习&#xff1a; 入门基础 了解Python的历史和应用领域安装Python解释器和开发环境&#xff08;如Anaconda、IDLE等&#xff09;学习使用Python的交互式解释器或集成开发环境&#xff08;IDE&#xff09;进行简单的代码编写和…

Seafile搭建个人云盘 - 内网穿透实现在外随时随地访问

文章目录 1. 前言2. SeaFile云盘设置2.1 Owncould的安装环境设置2.2 SeaFile下载安装2.3 SeaFile的配置 3. cpolar内网穿透3.1 Cpolar下载安装3.2 Cpolar的注册3.3 Cpolar云端设置3.4 Cpolar本地设置 4. 公网访问测试5. 结语 转载自cpolar极点云文章&#xff1a;使用SeaFile搭建…

【电影推荐系统】基于 ALS 的协同过滤推荐算法

目录 目的 用户电影推荐矩阵主要思路如下 1 UserId 和 MovieID 做笛卡尔积&#xff0c;产生&#xff08;uid&#xff0c;mid&#xff09;的元组 2 通过模型预测&#xff08;uid&#xff0c;mid&#xff09;的元组。 3 将预测结果通过预测分值进行排序。 4 返回分值最大的 …

elk中kibana使用

1.前言 kibana是一款作为elasticsearch可视化的一款软件&#xff0c;将elasticsearch中的数据以可视化的状态展现出来&#xff0c;kibana也提供了查询、统计、修改索引等功能 2.kibana使用 索引管理 在索引管理中&#xff0c;可以看到所有索引的状态、运行状况、主分片、副本…

pytorch快速入门中文——07(TensorBoard)

使用 TensorBoard 可视化模型&#xff0c;数据和训练 原文&#xff1a;https://pytorch.org/tutorials/intermediate/tensorboard_tutorial.html 在 60 分钟突击中&#xff0c;我们向您展示了如何加载数据&#xff0c;如何通过定义为nn.Module子类的模型提供数据&#xff0c;如…

计算机体系结构基础知识介绍之缓存性能的十大进阶优化之编译器控制的预取和利用HBM扩展内存层次(七)

优化九&#xff1a;编译器控制的预取以减少丢失惩罚或丢失率 硬件预取的替代方案是编译器在处理器需要数据之前插入预取指令来请求数据。 预取有两种类型&#xff1a; ■ 寄存器预取将值加载到寄存器中。 ■ 高速缓存预取仅将数据加载到高速缓存。 这两种类型都可以分为有错…

跟我一起从零开始学python(一)编程语法必修

前言 随着互联网的高速发展&#xff0c;python市场越来越大&#xff0c;也越来越受欢迎&#xff0c;主要源于它&#xff1a;易学易用&#xff0c;通用性广&#xff0c;时代需要&#xff0c;源代码的开放以及人工智能浪潮&#xff0c;接来下我们就从这几个方向谈谈为何python越…

17 MFC进程通信

文章目录 剪切板管道匿名管道父进程写入数据子进程读出数据 命名管道 邮槽邮槽服务器邮槽客户端 剪切板 设置界面 发送 //设置剪切板数据 void CClipboardDlg::OnBnClickedBtnSend() {UpdateData(TRUE);if (m_strSend.IsEmpty()){MessageBox(L"请输入需要设置的文本&quo…

微信小程序如何进行开发?

文章目录 0.引言1.注册微信公众平台账号2.准备微信开发者工具3.创建微信小程序并预览 0.引言 笔者编程一般编得较多的是桌面软件&#xff0c;有时也会编手机软件&#xff0c;这些软件都必须安装才能使用&#xff0c;这限制了软件的推广。而现有社交软件如微信使用得较广泛&…

Linux的编译器——gcc/g++(预处理、编译、汇编、链接)

文章目录 一.程序实现的两个环境二.gcc如何完成1.预处理2.编译3.汇编4.链接 三.动态库与静态库对比下二者生成的文件大小 四.gcc常用选项 前言&#xff1a; 本文主要认识与学习Linux环境下常用的编译器——gcc&#xff08;编译C代码&#xff09;/g&#xff08;编译C代码&#x…

深度学习--神经网络全面知识点总结(持续更新中)

文章目录 神经网络基础1.1 什么是神经网络&#xff1f;1.2 神经元和激活函数1.3 前向传播和反向传播1.4 损失函数和优化算法 深度神经网络2.1 卷积神经网络&#xff08;CNN&#xff09;2.2 循环神经网络&#xff08;RNN&#xff09;2.3 长短期记忆网络&#xff08;LSTM&#xf…

凝思系统docker离线安装

# linux离线安装docker (18.03.1-ce) ## 解压&#xff0c;得到docker文件夹 tar xzvf docker-18.03.1-ce.tgz ## 将docker文件夹里面的所有内容复制到/usr/bin目录 sudo cp docker/* /usr/bin/ ## 开启docker守护进程 sudo dockerd & 当终端中显示【API list…

Mathtype7Mac苹果ios简体中文版

对于很多人来说&#xff0c;每次编辑文字的时候遇到公式简直就是噩梦。像那些复杂的数学、物理还有化学公式&#xff0c;太难编辑出来了。 那么我们该怎么解决这些难题呢&#xff1f;其实很简单&#xff0c;用公式编辑器就行了。 公式编辑器&#xff0c;是一种工具软件&#…

网络安全之反序列化漏洞分析

简介 FastJson 是 alibaba 的一款开源 JSON 解析库&#xff0c;可用于将 Java 对象转换为其 JSON 表示形式&#xff0c;也可以用于将 JSON 字符串转换为等效的 Java 对象分别通过toJSONString和parseObject/parse来实现序列化和反序列化。 使用 对于序列化的方法toJSONStrin…