Lua内存泄露情况举例

原创 2016年05月30日 11:36:15

1、在多次刷新的情况下不停的 新建table;

如 Update()是一个不停被回调的函数,那么在Update里,
function Update()
local t = {};--创建表,内存泄露,游戏常见到
end
会产生很多消耗。

2、长字符串,虽然Lua虚拟机不会显示这块内存,但任务管理器还是会产生巨大的消耗。
如:
local s = "", 
for i = 1, 1000000, 1 do
  s = s .. i --字符串消耗大量内存
end

3、占位符,三个点作为参数的空函数,里面不执行占位符
function EventTouch(...)
end
该函数的调用会产生内存泄露,泄露规模和引入参数的个数有关,如EventTouch(t, x, y),调用一次和产生一个{t, x, y}的规模一样。处理办法:限定参数个数,调用占位符参数,或者去掉参数。

4、Lua面向对象产生内存泄露
看看构造函数:
Father = {};
function Father:New(o)
    local child = o or {};--分析:这里生成或者引用一个表,已经产生一次内存泄露;
    setmetatable(child, {__index = self});--这里因为保护父类,又增加一个表,泄露;
    return child;
end
常规省事的做法:
Father = {}
Father.__index = Father
function Father:New(o)
    local child = o or {}
    setmetatable(child, Father)--不用保护父类,减少不必要的内存消耗
    return child
end

5、创建坐标点(向量)产生内存泄露:
很多人因为C++,Java写多了,对于坐标一般都这样来
Object.Point = {X = 0, Y = 0}
这样写很蠢,因为又产生泄露,而且索引Object.Point.X 是相当慢的,用这种方法写出来的粒子比乌龟还慢。
比较好的写法:
Object.PointX = 0
Object.PointY = 0
很多人无法接受这样的写法,但事实上,这种写法最经济。如果你尝试讲一个算法从C改写为Lua,不妨尝试上述写法。

6、Lua调控userdata
如果userdata创建本身就产生大量内存消耗,这个要注意用日志前后打印出来

7、创建树:
树也会产生大量的表,最聪明的做法就是把树状表改为table,用一个表就可以直接表示完所有的树。

树是可以改写为广义表的,因此可以尝试用一个表,或者字符串序列表示树!
Node = {
   childs = {n1, n2, ...}
}

8、创建图:
类似上面,封闭图,开放图也可以改写为一个表。内存得到控制。

9、池管理出错了!
Pool = {}
Pool.ActiveObjects = {}
Pool.InactiveObjects = {}
function Pool:GetOjbect()
    --if Pool.InactiveOjbects 里还有死对象 then
        --激活第一个死对象,并挪到Pool.ActiveObjects里。
    --否则
        --从生成一个对象,放到Pool.ActiveObjects里
    --返回该对象的地址出来
end
Object = {}
Object.__index = Object
function Object:New(o)
    local obj = o or Pool:GetObject() 所有的对象均从Pool.ActiveObjects里获取,降低内存创建消耗
    setmetatable(obj, Ojbect)
    return obj
end
function Object:Delete()
    --
    Pool:Collect(self)
end

10、多维数组 内存泄露
其实多维也可以用一维表示
array = {
    {v11,v12,...,v1n},
    {v21,v22,...,v2n},
    ...
    {vm1,vm2,...,vmn},
}
这需要创建m个表;
改写如下:
array = {
    v11,v12,...,v1n,
    v21,v22,...,v2n,
    ...,
    vm1,vm2,...,vmn,
}
只要一张表!

11、闭包创建匿名函数泄露内存
function foo()
    return function() print("hello!") end --创建匿名函数,内存泄露
end
local helloFunc = foo()
helloFunc()
如果foo在回调过程里大量使用,那么会有产生大量泄露出来
比较好的办法,一次匿名,多次0泄露引用
版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

lua中的weak table及内存回收collectgarbage

弱表(weak table)是一个很有意思的东西,像C++/Java等语言是没有的。弱表的定义是:Aweak table is a table whose elements are weak refe...

《Programming in Lua 3》读书笔记(十三)

日期:2014.7.16 PartⅡ 17 Weak Tables and Finalizers Lua实现的是自动的内存管理。程序可以创建对象,可是没有现成的函数来实现删除对象。Lua使用...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

lua退出时内存删除的诡异异常及处理

写了一个很简单的脚本,调用了lxp,发现lua_close时异常。 借用网上的测试代码:http://www.gamedev.net/community/forums/topic.asp?topic...

Lua的内存监测和回收

Lua内存是自动收集的, 这点跟Java类似, 不被任何对象或全局变量引用的数据,将被首先标记为回收,不需要开发者做任何事情.但是,正如Java也会有内存泄露一样, Lua也会有, 只不过,跟C++的...

Lua性能优化—Lua内存优化

笔者在这里和大家分享了一些在Lua性能优化方面的经验。比如说拿到原始数据后,如何处理过滤数据、信息的经验,从而更快更准确地定位问题。如果大家有更好更精准的处理数据、过滤信息的方法请不吝赐教。
  • UWA4D
  • UWA4D
  • 2017-06-09 14:15
  • 627

游戏逻辑层在Lua中的内存泄漏与防范【转】

http://hi.baidu.com/hfpt_521/item/0c23dff3af454117d7ff8c10 Lua会造成内存泄露的表征分析: # 因素一:(实例型)实体资源的创建持有者和...

Lua的内存监测和回收

Lua内存是自动收集的, 这点跟Java类似, 不被任何对象或全局变量引用的数据,将被首先标记为回收,不需要开发者做任何事情.但是,正如Java也会有内存泄露一样, Lua也会有, 只不过,跟C++的...

Lua内存泄漏应对方法

由于目前正在负责的项目是一个二次开发项目,而且留给我们的代码质量实在让人无力吐槽,所以遇到了不少大大小小的坑,好在慢慢都淌过去了。最近就遇到了一个内存泄露的问题,泄露发生在lua里,项目代码里以前的开...

lua内存检测

由于目前正在负责的项目是一个二次开发项目,而且留给我们的代码质量实在让人无力吐槽,所以遇到了不少大大小小的坑,好在慢慢都淌过去了。最近就遇到了一个内存泄漏的问题,泄漏发生在lua里,项目代码里以前的开...

Lua内存泄露检测原理和weak_table弱引用

lua内存泄露 首先第一点,lua中的内存泄露和我们所说的c/c++中的内存泄露本质上是不一样的。 lua中有垃圾回收机制(GC),所以理论上是不会有内存泄露的。当它进行GC的时候,会从根部开始扫描所...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)