[转载]Lua 内存泄露举例
来源:互联网 发布:吉林快三遗漏数据 编辑:程序博客网 时间:2024/04/29 07:31
原文地址:Lua 内存泄露举例 作者:敏捷小菜
本文从Lua语法的角度来介绍Lua内存出现泄露的问题;
如 Update()是一个不停被回调的函数,那么在Update里,
function Update()
local t = {};--创建表,内存泄露,游戏常见到
end
会产生很多消耗。
2、长字符串,虽然Lua虚拟机不会显示这块内存,但任务管理器还是会产生巨大的消耗。
如:
local s = "",
for i = 1, 1000000, 1 do
end
3、占位符,三个点作为参数的空函数,里面不执行占位符
function EventTouch(...)
end
该函数的调用会产生内存泄露,泄露规模和引入参数的个数有关,如EventTouch(t, x, y),调用一次和产生一个{t, x, y}的规模一样。处理办法:限定参数个数,调用占位符参数,或者去掉参数。
4、Lua面向对象产生内存泄露
看看构造函数:
Father = {};
function Father:New(o)
end
常规省事的做法:
Father = {}
Father.__index = Father
function Father:New(o)
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 = {
}
8、创建图:
类似上面,封闭图,开放图也可以改写为一个表。内存得到控制。
9、池管理出错了!
Pool = {}
Pool.ActiveObjects = {}
Pool.InactiveObjects = {}
function Pool:GetOjbect()
end
Object = {}
Object.__index = Object
function Object:New(o)
end
function Object:Delete()
end
10、多维数组 内存泄露
其实多维也可以用一维表示
array = {
}
这需要创建m个表;
改写如下:
array = {
}
只要一张表!
11、闭包创建匿名函数泄露内存
function foo()
end
local helloFunc = foo()
helloFunc()
如果foo在回调过程里大量使用,那么会有产生大量泄露出来
比较好的办法,一次匿名,多次0泄露引用
原文链接:http://blog.sina.com.cn/s/blog_4891efbd01016ubn.html
0 0
- [转载]Lua 内存泄露举例
- Lua内存泄露情况举例
- 内存泄露分析举例
- Lua 内存泄露
- lua内存泄露
- 转载:内存泄露
- java内存泄露【转载】
- lua中检测内存泄露
- lua内存泄露检测原理
- Lua内存泄露检测原理
- [Lua]Lua内存泄露检测原理
- 转载:c++内存泄露机制
- 内存泄露定位(转载)
- [转载]Ogre中的内存泄露
- Flex内存优化原则和内存泄露举例
- 记录当前项目lua内存泄露问题
- Android性能优化篇(二),内存泄露的举例分析
- 《转载》android context 与内存泄露
- Java代理模式(动态与静态)
- 刻度设置
- C# 深入理解堆栈、堆在内存中的实现
- Shuffle'm Up poj 3087 bfs
- 深度学习文章4:计算图像数据集的均值
- [转载]Lua 内存泄露举例
- GIT第一讲 基础和安装
- Android Toast自定义
- 按照文件扩展名排列的 Mime 类型列表
- [Android入门]从零构建Android app之天气——7.在欢迎页加载并缓存数据
- httpclient https忽略证书
- 开源软件七大盈利模式
- java Future 接口介绍
- Java中的24种设计模式与7大原则