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

Lua和JS的垃圾回收机制

Lua 和 JavaScript 都采用了 自动垃圾回收机制(GC) 来管理内存,开发者无需手动释放内存,但它们的 实现机制和行为策略不同。下面我们从原理、策略、优缺点等方面来详细对比:


🔶 1. 基本原理对比

特性LuaJavaScript
垃圾回收类型增量式垃圾回收(Incremental GC)标记-清除、标记-压缩、分代回收等多策略
算法核心增量式标记-清除分代式标记-清除(V8 引擎)
回收触发机制基于内存分配/步进基于分配触发、空闲时间回收(V8: idle GC)
回收对象无用的 table/closure/userdata 等所有不可达的对象(闭包、数组、对象等)

🔷 2. Lua 的垃圾回收机制

Lua(默认使用的是 增量式 GC,Lua 5.1 开始引入)

✅ 工作原理

  1. 标记阶段:标记所有可达对象(从根开始遍历)

  2. 清除阶段:回收所有未被标记的对象

✅ 特点

  • 增量式(逐步执行,避免卡顿)

  • 手动控制收集(collectgarbage 函数)

  • 无分代回收(即老对象和新对象一样处理)

✅ 示例

-- 手动触发 GC
collectgarbage("collect")         -- 执行一次完整GC
collectgarbage("count")           -- 查看当前内存使用(KB)
collectgarbage("step", 100)       -- 执行一步GC

🔷 3. JavaScript 的垃圾回收机制(以 V8 引擎为例)

V8(Chrome、Node.js 使用)采用的是 分代垃圾回收 + 多策略优化

✅ 工作原理(简化版)

  1. 新生代(Young Generation)

    • 存放生命周期短的对象

    • 采用 Scavenge 算法(复制 + 清除)

  2. 老生代(Old Generation)

    • 存放生命周期长或经常访问的对象

    • 采用 标记-清除标记-压缩 算法

  3. 增量与并发优化

    • 支持 增量 GC(Incremental GC)

    • 支持 并发 GC(Concurrent GC)

    • 支持空闲时间回收(Idle GC)

✅ 优点

  • 高效,适用于复杂的大型前端/Node.js 应用

  • 分代机制减少频繁回收老对象

  • 自动触发,基本无感知


📌 4. 对比总结

对比项LuaJavaScript(V8)
类型增量式标记清除分代式 + 增量 + 并发 + 空闲优化
可配置性高(可手动调控)低(主要由引擎内部控制)
分代支持❌ 不支持✅ 支持(年轻代/老年代)
调用控制collectgarbage() 等函数手动调用无公开 API,完全自动
性能表现简洁但在大型项目中可能频繁 GC 卡顿高效,适用于大规模 JS 应用

✅ 最后总结一句话:

  • Lua 的 GC 更轻量、可控性强、适合嵌入式和脚本环境

  • JavaScript 的 GC 更复杂、高效,适合大规模 Web 应用和复杂对象图

lua垃圾回收文章:Lua内存管理与垃圾收集机制详解-CSDN博客,lua垃圾回收机制-CSDN博客

http://www.lryc.cn/news/2402828.html

相关文章:

  • 实践指南:从零开始搭建RAG驱动的智能问答系统
  • 边缘计算服务器
  • 矩阵的偏导数
  • 第R9周:阿尔茨海默病诊断(优化特征选择版)
  • 电动螺丝刀-多实体拆图建模案例
  • 当丰收季遇上超导磁测量:粮食产业的科技新征程
  • 电子电气架构 --- 什么是功能架构?
  • Android四大组件通讯指南:Kotlin版组件茶话会
  • C++.OpenGL (11/64)材质(Materials)
  • AudioRelay 0.27.5 手机充当电脑音响
  • 会计 - 合并1- 业务、控制、合并日
  • 前端项目eslint配置选项详细解析
  • NVIDIA Dynamo:数据中心规模的分布式推理服务框架深度解析
  • 第十三节:第四部分:集合框架:HashMap、LinkedHashMap、TreeMap
  • Spring AI之RAG入门
  • 应用案例 | 设备分布广, 现场维护难? 宏集Cogent DataHub助力分布式锅炉远程运维, 让现场变“透明”
  • C#中的密封类与静态类:特性、区别与应用实例
  • LINUX 66 FTP 2 ;FTP被动模式;FTP客户服务系统
  • 网心云 OEC/OECT 笔记(2) 运行RKNN程序
  • vue-21 (使用 Vuex 模块和异步操作构建复杂应用)
  • #开发环境篇:postMan可以正常调通,但是浏览器里面一直报403
  • 将word文件转为kindle可识别的azw3文件的方法
  • 动态规划之01背包
  • Lua和JS的继承原理
  • 灵活控制,modbus tcp转ethernetip的 多功能水处理方案
  • boost::qvm 使用示例
  • go语言学习 第6章:错误处理
  • VMware 安装 CentOS8详细教程 (附步骤截图)附连接公网、虚拟机yum源等系统配置
  • Editing Language Model-based Knowledge Graph Embeddings
  • 深入了解linux系统—— 进程池