博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Lua模块的加载与内存释放
阅读量:6158 次
发布时间:2019-06-21

本文共 1038 字,大约阅读时间需要 3 分钟。

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

 

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

前往下载页面   ,然后下载最新版本

image

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

image

进入下载好的 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] = nilend

 

实际测试的示例

内存回收

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

转载地址:http://utofa.baihongyu.com/

你可能感兴趣的文章
Red Hat 安装源包出错 Package xxx.rpm is not signed
查看>>
编译安装mysql-5.6.16.tar.gz
查看>>
活在当下
查看>>
每天进步一点----- MediaPlayer
查看>>
PowerDesigner中CDM和PDM如何定义外键关系
查看>>
跨域-学习笔记
查看>>
the assignment of reading paper
查看>>
android apk 逆向中常用工具一览
查看>>
MyEclipse 报错 Errors running builder 'JavaScript Validator' on project......
查看>>
Skip List——跳表,一个高效的索引技术
查看>>
Yii2单元测试初探
查看>>
五、字典
查看>>
前端js之JavaScript
查看>>
Log4J日志配置详解
查看>>
实验7 BindService模拟通信
查看>>
scanf
查看>>
Socket编程注意接收缓冲区大小
查看>>
SpringMVC初写(五)拦截器
查看>>
检测oracle数据库坏块的方法
查看>>
SQL server 安装教程
查看>>