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

相关推荐
Theodore_10222 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
冰帝海岸3 小时前
01-spring security认证笔记
java·笔记·spring
世间万物皆对象3 小时前
Spring Boot核心概念:日志管理
java·spring boot·单元测试
没书读了4 小时前
ssm框架-spring-spring声明式事务
java·数据库·spring
----云烟----4 小时前
QT中QString类的各种使用
开发语言·qt
lsx2024064 小时前
SQL SELECT 语句:基础与进阶应用
开发语言
小二·4 小时前
java基础面试题笔记(基础篇)
java·笔记·python
开心工作室_kaic4 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
向宇it4 小时前
【unity小技巧】unity 什么是反射?反射的作用?反射的使用场景?反射的缺点?常用的反射操作?反射常见示例
开发语言·游戏·unity·c#·游戏引擎
懒洋洋大魔王4 小时前
RocketMQ的使⽤
java·rocketmq·java-rocketmq