当前位置: 首页 > article >正文

lua gc垃圾回收知识记录

一、什么是lua gc

在Lua中,GC是"Garbage Collection"(垃圾回收)的缩写。Lua使用自动内存管理,这意味着程序员不需要显式地分配和释放内存。相反,Lua运行时环境负责跟踪哪些数据对象正在被使用,并自动释放不再使用的对象的内存。这个过程就称为垃圾回收。

Lua的垃圾回收器是自动运行的,并且对于大多数应用程序来说是透明的。但是,程序员仍然可以通过Lua的API或标准库中的一些函数来影响垃圾回收的行为。例如,collectgarbage函数可以用来控制垃圾回收器的行为,包括强制执行垃圾回收,获取垃圾回收器使用的内存量,以及设置垃圾回收器的暂停时间和步进乘数等。

二、lua 5.1 gc原理

Lua 5.1 的垃圾回收(GC)机制基于标记-清除(mark-and-sweep)算法。这种算法是许多现代编程语言中常见的垃圾回收策略。

  1. 标记阶段(Marking Phase)
    • Lua 运行时维护一个“白名单”和一个“灰名单”。白名单包含所有当前活跃的对象(即那些可以直接或间接从根集合访问到的对象),而灰名单则包含那些已经被访问过但其子对象还未被访问的对象。
    • GC 开始时,所有根对象(如全局变量、注册表、线程栈上的对象等)都被放入灰名单。
    • 然后,GC 遍历灰名单中的每个对象,将其标记为已访问(即放入白名单),并将其子对象放入灰名单。这个过程递归进行,直到灰名单为空。
    • 在这个过程中,任何从根集合无法到达的对象都不会被标记,因此它们被视为垃圾。
  2. 清除阶段(Sweeping Phase)
    • 在标记阶段完成后,所有未被标记的对象(即垃圾对象)的内存都会被释放。
    • Lua 还会整理内存,将存活的对象移动到连续的内存区域,以便更有效地利用内存。

Lua 5.1 的 GC 还有一些其他特点:

  • 增量收集(Incremental Collection):为了减少对应用程序性能的影响,Lua 的 GC 可以以增量的方式运行。这意味着 GC 可以在应用程序执行期间多次运行一小部分,而不是一次性运行完整的标记和清除过程。
  • 紧急收集(Emergency Collection):如果 Lua 运行时检测到内存不足,它会触发一次紧急 GC 来回收尽可能多的内存。
  • 暂停时间和步进:Lua 的 GC 可以配置为在每次收集时暂停较短的时间,或者每次收集一小部分内存。这有助于在实时系统中平衡内存使用和性能。

需要注意的是,虽然 Lua 的 GC 机制对于大多数应用程序来说是足够的,但在某些特殊情况下(如处理大量短生命周期对象或进行复杂的内存操作),程序员可能仍然需要仔细管理内存,以避免潜在的性能问题或内存泄漏。此外,使用 ffi 库或进行低级内存操作时,程序员必须特别小心,因为 Lua 的 GC 不会管理这些区域的内存。

三、性能考虑

  • GC 暂停
           
    虽然 Lua 的 GC 试图减少对应用程序性能的影响,但在执行完整的 GC 时,它仍然会暂停应用程序的执行。这可能导致可察觉的延迟,特别是在实时系统或高性能应用中。
     
  • 内存碎片

         长时间的运行和频繁的 GC 可能导致内存碎片。虽然 Lua 的 GC 会尝试整理内存,但在某些情况下,可能需要手动干预或使用其他内存管理策略
  • 弱引用的使用

          弱表提供了一种机制来创建非强引用关系,这有助于减少不必要的内存占用。然而,过度使用弱引用可能会导致 GC 的负担增加,因为每次 GC 运行时都需要检查弱表中的键值对。因此,在使用弱表时需要权衡其带来的便利性和潜在的性能开销。


http://www.kler.cn/a/272210.html

相关文章:

  • StarRocks 3.4 发布--AI 场景新支点,Lakehouse 能力再升级
  • [HCTF 2018]WarmUp
  • 软件授权产品介绍
  • 二叉树--堆排序
  • Ubuntu cuda-cudnn中断安装如何卸载
  • 如何使用 Python 进行文件读写操作?
  • 如何在MATLAB中处理图像和视频?
  • AJAX-XMLHttpRequest
  • Pytorch NLP入门3:用嵌入表示单词
  • 接口测试及接口测试工具【Postman】相关的面试题
  • 微信小程序Skyline模式自定义tab组件胶囊与原生胶囊平齐,安卓和ios均自适应
  • 类似web版Navicat mysql客户端==phpMyAdmin源码启动
  • 使用Python构建RESTful API的最佳实践【第137篇—RESTful API】
  • llama笔记:官方示例解析 example_chat_completion.py
  • Mysql数据库的多实例部署
  • (十七)【Jmeter】取样器(Sampler)之JSR223取样器
  • 基于STM32的智能衣柜系统设计
  • 访问者模式(Visitor Pattern)
  • Apache-Doris基础概念
  • 什么数据需要存在Redis里?缓存的缺点?怎样进行数据同步?
  • 基于Python的股票市场分析:趋势预测与策略制定
  • Qt文件以及文件夹相关类(QDir、QFile、QFileInfo)的使用
  • 安卓国产百度网盘与国外云盘软件onedrive对比
  • docker快速安装和详细安装-保姆教程
  • 蓝桥杯day2刷题日记
  • React 的 diff 算法