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。为什么会这么大,有待进一步从源码中寻找答案。

时间: 2024-08-02 17:09:53

Lua模块的加载与内存释放的相关文章

可执行程序加载到内存的过程

http://blog.csdn.net/q_l_s/article/details/52594252 在linux中,程序的加载,涉及到两个工具,linker 和loader.Linker主要涉及动态链接库的使用,loader主要涉及软件的加载. 1.  exec执行一个程序 2.  elf为现在非常流行的可执行文件的格式,它为程序运行划分了两个段,一个段是可以执行的代码段,它是只读,可执行:另一个段是数据段,它是可读写,不能执行. 3.  loader会启动,通过mmap系统调用,将代码端和

Python模块动态加载机制

本文和大家分享的主要是python中模块动态加载机制相关内容,一起来看看吧,希望对大家学习python有所帮助. import 指令 来看看 import sys 所产生的指令: co_consts : (0, None) co_names : ('sys',) 0 LOAD_CONST               0 (0) 2 LOAD_CONST               1 (None) 4 IMPORT_NAME              0 (sys) 6 STORE_NAME  

[WP8.1UI控件编程]Windows Phone大数据量网络图片列表的异步加载和内存优化

11.2.4 大数据量网络图片列表的异步加载和内存优化 虚拟化技术可以让Windows Phone上的大数据量列表不必担心会一次性加载所有的数据,保证了UI的流程性.对于虚拟化的技术,我们不仅仅只是依赖其来给列表加载数据,还可以利用虚拟化的特性去做更多的事情.虚拟化技术有一个很重要的特性就是,它可以准确地判断出哪些列表项处于手机屏幕中,可以动态地去更新这些数据.基于这样的特性,我们可以给列表的功能做更多的优化. 那么下面我们基于一个例子来讲解利用虚拟化技术去做列表的性能优化.有这么一个需求,需要

一张jpg图片实际加载过程内存消耗

一张jpg图片实际加载过程内存消耗,以一张1024*1024 argb8888 500k的jpg图片为例: a.读取图片文件(消耗图片大小内存,500k)     b.解析jpg数据(cgimage, 4mb) c.释放500k的图片内存    d.opengl纹理数据(4mb)    e.释放cgimage的4mb内存.      注意,这个过程不是必然的顺序执行,释放cgimage内存的实际是有系统决定的,会很快,但是不一定是立即执行.  所以内存会瞬间飙升9mb左右,然后减少5mb,稳定到

016-1 模块-模块的加载顺序、导入执行流程

1.模块的加载顺序:内存=>内置=>sys.path import sys sys,path #环境变量:存放文件路径的列表 # 重点:默认列表的第一个元素就是当前被执行的问建所在的目录 # 可以自定义往sys.path添加路径sys.path.append(r'想导入的模块的绝对路径')  # 添加到环境变量最后,最后被查找sys.path.insert(0, r'想导入的模块的绝对路径')  # 添加到指定索引,索引就决定了自定义模块的查找顺序 2.模块的导入执行流程 导入模块的指令: -

cocos2dx lua中异步加载网络图片,可用于显示微信头像

最近在做一个棋牌项目,脚本语言用的lua,登录需要使用微信登录,用户头像用微信账户的头像,微信接口返回的头像是一个url,那么遇到的一个问题就是如何在lua中异步加载这个头像,先在引擎源码里找了下可能会提供这个功能的地方,发现好像没有提供类似功能,那么只能自己动手写.所以我在ImageView这个类里面添加了一个成员方法,其实可以不写在ImageView里,而且我觉得非必需情况下还是不要修改引擎源码的好,因为如果源码改动比较多的话,将来引擎版本升级会比较麻烦.我写在ImageView里纯粹是想偷

Android下将图片加载到内存中

Android的系统的标准默认每个应用程序分配的内存是16M.所以来说是非常宝贵的,在创建应用的时候要尽可能的去节省内存,但是在加载一些大的文件的时候,比如图片是相当耗内存的,一个1.3M的图片,分辨率是2560X1920(宽X高)图片当加载到手机内存的时候就会请求19M的一块内存,这是远远超出了系统自带的内存空间,这时候应用程序就会挂掉,所以我们要进行图片的缩放处理,下面我就来带大家创建一个用来图片缩放的应用: 应用效果图如下: 核心代码的实现: package com.examp.loadp

android加载大量图片内存溢出的三种方法

android加载大量图片内存溢出的三种解决办法 方法一:  在从网络或本地加载图片的时候,只加载缩略图. /** * 按照路径加载图片 * @param path 图片资源的存放路径 * @param scalSize 缩小的倍数 * @return */ public static Bitmap loadResBitmap(String path, int scalSize) { BitmapFactory.Options options = new BitmapFactory.Option

seajs2.3学习日志 简单尝试模板+数据合并、模块异步加载、非标准CMD模式定义define模块

今天继续尝试seajs 2.3的版本,那做点什么demo好呢,就来一个简单是数据模板吧,然后通过其他一些细节深入学习 先看看目录结构,按照官方demo架设 index.html只是简单入口文件和seajs的配置项,最下面有一个seajs.use加载crontroller模块,然后回调暴露的combine方法 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>