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 运行时都需要检查弱表中的键值对。因此,在使用弱表时需要权衡其带来的便利性和潜在的性能开销。

相关推荐
karry_k20 小时前
MyBatis批量insert-select踩坑:useGeneratedKeys=true 可能让PostgreSQL返回大量插入结果
java·后端
karry_k20 小时前
PostgreSQL 在 MyBatis 中执行正常 SQL 失效:一次 DELETE USING 踩坑记录
java·后端
SamDeepThinking1 天前
从源码到代码:MyBatis-Flex 与 MyBatis-Plus 的逐项对比
java·后端·程序员
她的男孩1 天前
Spring Boot 接 Flowable 工作流:用 3 个注解搭一个请假审批流程
java·后端·架构
荣码1 天前
LLM结构化输出:让AI返回JSON而不是废话,我踩了4个坑
java·python
plainGeekDev1 天前
Gson → kotlinx.serialization
android·java·kotlin
小bo波2 天前
Java Swing 图形用户界面实验 —— 从算术练习到游戏开发的完整实践
java·课程设计·gui·游戏开发·扫雷·swing
咖啡八杯2 天前
GoF设计模式——备忘录模式
java·后端·spring·设计模式