Lua模块的加载与内存释放

今天早上听说一件事情让我觉得很诡异的事情:公司线上的一款游戏,加载一份配置资源后,内存涨了几十M,然后内存再也下不来了。因为好奇,所以要来了最大的一个配置文件(4.5M,去除空格与换行后的大小),进行测试。最终发现,内存其实是可以被释放的,不过需要注意以下的规则。

同时,为了证明luac 与 luajit 表现一致,我同时也使用了 luajit 进行了测试。

前往下载页面 http://luajit.org/download.html  ,然后下载最新版本

在开始菜单中找到 Visual Studio的 Command Prompts

进入下载好的 luajit 解压目录 LuaJIT-2.1.0-beta2/src  运行 msvcbuild.bat

重点在模块的编写,模块编写的方法导致了释放内存的不同。

当 require 准备加载一个 lua 文件时,它会先检测 package.loaded[modulename] 是否返回 false,如果不是 false,它直接返回相应存储的值,否则查找并加载相应的文件,找不到就报错。

当加载的一个 lua 模块,如果没有 return 任何值时,package.loaded[modulename] 值为 true。

当加载一个 lua 模块,返回一个 table 时,package.loaded[modulename] 值为 table。

我拿到的 lua 文件是这样定义的,原本是一个json,将其转为lua的,将所有数据赋值给一个变量(require 之后多了一个全局变量),这样 package.loaded[modulename] 为 true,重置这个值并不会回收内存,需要同时清理全局变量(将相应变量置为 nil),才可以实现内存的回收。

示例代码:

local a = require(“b”) -- clear a = nil package.loaded[“b”] = nil collectgarbage() print(collectgarbage("count") / 1024)

可以针对上面的函数,封装一个unrequire

function unrequire(m)
    package.loaded[m] = nil
    _G[m] = nil
end

实际测试的示例

上面的20.xx是M,你没看错。一个约4.5M的 lua 文件,被 require 进内存后,lua 所占用的内存大小变为 20M。为什么会这么大,有待进一步从源码中寻找答案。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Golang语言社区

golang插件化方案

业务线的活动,每一次新活动都做独立项目开发,有大量重复代码,并且浪费数据服务的连接资源;排序服务也许要经常添加业务代码,目前是停服务发布……这些场景为了开发维护...

51120
来自专栏Crossin的编程教室

【Python 第64课】python shell

各位好久不见,我终于又更新了:D。今天抽空来讲点非常非常基础的东西,关于在哪里写 python。 如果你已经编写过自己的程序,相信对这些内容已经熟悉。但很多刚刚...

357100
来自专栏Django中文社区

概述

通常情况下,Django 的视图函数(View)是一个纯粹的 Python 函数,它接收一个 request(HTTP 请求),返回一个 response(HT...

28470
来自专栏IT派

秒懂Python编程中的if __name__ == 'main' 的作用和原理

一天偶然发现知乎上有篇关于对python编程中的if __name__ == 'main'的理解陈述,看完之后,自己觉得不够简单明了,于是在其文章底部写了一句话...

11010
来自专栏一个爱吃西瓜的程序员

Python爬虫学习--爬虫基本架构

一个简单的爬虫架构由爬虫调度端、URL管理器、网页下载器和网页解析器四部分构成。它们之间的关系如下图: ? ● 爬虫调度端:启动爬虫,停止爬虫,监视爬虫的运行情...

40360
来自专栏地方网络工作室的专栏

Shell 命令行 从日志文件中根据将符合内容的日志输出到另一个文件

Shell 命令行 从日志文件中根据将符合内容的日志输出到另一个文件 前面我写了一篇博文Shell 从日志文件中选择时间段内的日志输出到另一个文件,利用循环实现...

19670
来自专栏FreeBuf

微信支付SDK 0元购Hack思路分享

* 本文作者:zjie2O71,本文属FreeBuf原创奖励计划,未经许可禁止转载

13530
来自专栏IMWeb前端团队

尾递归的后续探究

0 前言 去年大致也是这个事件,曾经探索过尾调用(PTC)相关的内容,并总结了一片文章——朋友你听说过尾递归吗。同时在文章的最后也留下了一个坑: 尾递归写法的...

227100
来自专栏枕边书

Linux“体检”指标

前言 在“求佛保佑服务器不宕机”、“杀程序员祭天”的环境下,程序员每天可谓是战战兢兢,接到电话和短信都吓得瑟瑟发抖,为了我们的安全,及时发现服务器运行问题已不仅...

26960
来自专栏Kotlin入门系列

win7基础 环境变量的配置 不借助变量,直接添加路径的方式

19650

扫码关注云+社区

领取腾讯云代金券