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内存泄露情况举例相关推荐
- Lua内存泄露检查和性能检测工具
1. ToLua#的编译 之前的博客有提到过,我们使用的是ToLua#作为Unity引擎和Lua之间的桥接工具,本文记录的集成工具都是在C层进行的,因此要编译自己的ToLua#. ToLua#的源码地 ...
- malloc函数的使用以及内存泄露情况
2019独角兽企业重金招聘Python工程师标准>>> malloc函数与new的区别 从函数声明上可以看出.malloc 和 new 至少有两个不同: new 返回指定类型的 指针 ...
- pmap gdb 分析堆外内存泄露情况
一.查看内存分部 pmap -x 8 | sort -k3 -n -r | more ---- 8 是 PID 最大的肯定是堆内存. 其他的就需要看情况来分析了. 二.cat /pr ...
- linux 进程内存分析工具,Linux内存使用情况以及内存泄露分析之工具与方法
1. 内存使用情况分析 1.1 系统总内存分析 通过cat /proc/meminfo,可用的物理内存=MemFree+Buffers+Cached. MemTotal: 5933132 ...
- java 匿名内部类内存泄露_Android 常见内存泄露 解决方案
前言 内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃 (OOM) 等严重后果. 那什么情况下不能被 ...
- C++内存泄露 与 野指针总结
跟前辈交流收获心德,使用非常精炼的形式描述内存泄露与野指针的本质.在此与大家分享,欢迎多多交流. 下面给出理解描述: 指针变量作用域 被指向对象生命周期 造成的结果 情况一 超出作用 ...
- Unity lua内存泄漏与性能检测
上周UWA发表了一片博文Lua性能优化-Lua内存优化作者分享了在unity中lua使用的不少干货,文中提到两个lua的小插件,一个是内存检查工具Snapshot,一个是性能分析工具LuaProfil ...
- Analyzer tool(MAT)分析JVM内存泄露案例
1.监控目的 2.常用分析工具 3.分析案例-MAT MAT 介绍及分析: 启动MAT, 然后选择菜单项 File- Open Heap Dump 来加载需要分析的堆转储文件.文件加载完后,可以看到如 ...
- linux注入内存泄露,Linux 内存泄露小结
本文仅限记录自己的一次 内存泄露追踪小记. 可能并不十分适用与大家的情况.而且方法也并不是很smart.仅做记录,能提供个思路更好. 一. 要问调试程序遇到什么问题最头疼, 内存泄露肯定能排在前几名里 ...
- C++ 内存泄露处理方法 (转)
1.可以显示内存泄露情况,但无法找到具体的文件位置写法 包含头文件#include <crtdbg.h> 然后在需要检测内存泄露的位置加上语句 _CrtDumpMemoryLeaks(); ...
最新文章
- 关于一对多,多对多的多表查询的控制
- Maven修改默认本地资源库文件夹
- 如何通过在ViewPager中用手指轻扫来禁用分页,但是仍然能够以编程方式轻扫?
- display 的 32 种写法
- python创建文件名称_如何在Python中创建递增文件名?
- jq 封装弹窗提示框,自动消失,确认
- 编程笔记:python 中的 OrderedDict
- Portable SharpDevelop(PSD):便携的DotNet集成开发环境
- leg引擎适合什么系统的服务器,第一讲 LEG引擎服务端更新BLUE引擎
- python 微博自动点赞软件_python3 爬虫学习: 自动给你心上人的微博点赞
- php在线拍照代码,html5可以实现在线拍照了
- 重组人骨形态发生蛋白-2(BMP 2)的研究意义
- 《植物大战僵尸》游戏存档修改
- shell双引号、单引号、反撇号的使用
- 生活记录:突然“醒来”
- grid_map(一):grid_map学习
- Axure原型模板、元件库、组件库
- 屏幕录像怎么录?分享3个简单实用的方法!
- 无线充电系统Ltspice仿真
- MacOS下使用UClient
热门文章
- optistruct入门推荐
- 嵌入式Linux,4G模组驱动,移远EC20、EC25使用随笔-内核kernel
- 2021年浙江省职业院校技能大赛“新华三杯”大数据技术与应用比赛 比赛经验
- 北风网 传智播客 视频地址
- Oracle在SQL语句中对时间操作、运算
- 自定义EasyUI图标样式
- CFS三层靶机搭建及其内网渗透
- Oracle学习方法
- 卡巴斯基重新激活试用版的方法
- 快解析 : 管家婆A8远程访问解决方案