关于lua闭包导致引用无法释放内存泄露
最近项目存在严重的内存泄漏问题,每次切level 会增加20M无法释放的内存,翻遍了项目用了多个工具,查询资料等
发现项目中两种存在内存泄露的情况
1.lua闭包的不当使用,对比包的引用要及时 释放。
2.注册事件未及时取消订阅,注册到C#的luafunction 用完一定要dispose,委托事件要对应取消订阅或清空事件。
lua闭包写法
function BaseCtrl:genSelfFuncCallback(fn)
local that = self;
return function ()
fn(that);
end
end
使用时需要注意,出现引用无法释放的情况
1.将该返回值赋值给一个变量,则会导致闭包return function 一直处于引用状态,需要将该变量重新赋值,如
local a = self:genSelfFuncCallback(self.func) --此时a引用了闭包的function 由于function有应用 function会一直存在切function内的变量会一直存在包括局部变量
a() --执行但是 a不会释放该引用
a = nil --重新赋值 使a 释放对闭包的引用这样闭包的引用才能被GC回收
2.如果只是执行没有引用闭包 则不会出现无法释放 执行过后会自动回收
切记切记 对闭包的引用要及时释放 否则内存泄露
另外要注意事件的订阅和取消:https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/events/how-to-subscribe-to-and-unsubscribe-from-events
关于lua闭包导致引用无法释放内存泄露的更多相关文章
- cocos2d-x 从onEnter、onExit、 引用计数 谈内存泄露问题
/////////////////////////////////// //author : zhxfl //date : 2013.8.29 //email : 291221622@qq.co ...
- 关于js闭包是否真的会造成内存泄漏(转载)
闭包是一个非常强大的特性,但人们对其也有诸多无解.一种危言耸听的说法是闭包会造成内存泄露. 局部变量本来应该在函数退出的时候被解除引用,但如果局部变量被封闭在闭包形成的环境中,那么这个局部变量就能一直 ...
- C# 定时器导致的内存泄露问题
C# 中有三种定时器,System.Windows.Forms 中的定时器和 System.Timers.Timer 的工作方式是完全一样的,所以,这里我们仅讨论 System.Timers.Time ...
- javascript js 内存泄露
JavaScript 内存泄露 1.什么是闭包.以及闭包所涉及的作用域链这里就不说了. 2.JavaScript垃圾回收机制 JavaScript不需要手动地释放内存,它使用一种自动垃圾回收机制(ga ...
- java内存溢出和内存泄露
虽然jvm可以通过GC自动回收无用的内存,但是代码不好的话仍然存在内存溢出的风险. 最近在网上搜集了一些资料,现整理如下: —————————————————————————————————————— ...
- 关于Android 的内存泄露及分析
一. Android的内存机制Android的程序由Java语言编写,所以Android的内存管理与Java的内存管理相似.程序员通过new为对象分配内存,所有对象在java堆内分配空间:然而对象的释 ...
- Java内存泄露的原因
Java内存泄露的原因 1.静态集合类像HashMap.Vector等的使用最容易出现内存泄露,这些静态变量的生命周期和应用程序一致,所有的对象Object也不能被释放,因为他们也将一直被Vector ...
- android内存泄露小谈
在做android的时候,用的语言大部分情况下都是java.以前最开始做的是编译器开发, 大部分情况都是用c语言和x86与arm架构的汇编,后来接触到ios用的是OC.对比之下, 感觉还是java用起 ...
- Android 从java字节码告诉你 为什么Handler会造成内存泄露
很多人面试的时候,都知道Handler 极易造成内存泄露,但是有一些讲不出来为什么,好一点的 会告诉你looper msg 之类的,但是你再往下问 为什么msg持有handler handler为什么 ...
随机推荐
- Linux/Unix 常用的 15 类别名(alias)
背景 最近在整理 Linux 运维基线,整理记录下常用的 alias 设置. alias alias 命令用于设置指令的别名.用于简化较长的命令. 语法 alias [别名]=[指令名称] 示例:al ...
- 我的自定义多交互live2d折腾经历
在@m0d1 大佬的督促(?)下有了这篇复盘.不过因为可能很多地方讲得不全面+理解不够深入,故不打算把这篇当成是教程/指南,那就算是一个指北吧= = (划重点:不是教程!不是教程!不是教程! 省流简介 ...
- D - D ZOJ - 1151 (字符串操作)
For each list of words, output a line with each word reversed without changing the order of the word ...
- Vulkan移植GpuImage(四)从D到O的滤镜
现把D到O的大部分滤镜用vulkan的ComputeShader实现了,列举其中一些有点特殊的说明. GaussianBlurPosition 指定区域高斯模糊 没有按照GPUImage里的方式实现, ...
- 二向箔web安全学院 --新手入门
二向箔安全学院 click here 新手入门|梦境穿越 1.要建立一个这样的观念|理解:计算机之所以是计算机,是它具有重复进行某种指令的特征,因而我们写的代码 or 脚本,本质上就是让计算机代替我们 ...
- 解决小程序中Data.parse()获取时间戳IOS不兼容
由于与后台接口必须对比时间戳所以首先得前台获取时间戳.刚开始是获取手机本地时间,但用户改了时间就废了..... 后来就从服务器上获取个时间再转换为时间戳(是不是很操蛋,先从服务器上获取在TM的自己比较 ...
- 【责任链模式】责任链模式结合Spring实战Demo
备注: 责任链与策略模式有很多相似之处,如都是行为型设计模式,都能够处理代码中的if-else逻辑 主要区别在于: 策略模式 封装了算法,通过上下文对象去接受客户端的数据,根据数据类型执行不同的算法 ...
- 哈希爆破神器Hashcat的用法
目录 HashCat HshCat的使用 使用Hashcat生成字典 使用Hashcat破解NTLMv2 HashCat HashCat系列软件在硬件上支持使用CPU.NVIDIA GPU.ATI G ...
- Linux-鸟菜-6-文件与目录的 默认权限、隐藏权、特殊权限
Linux-鸟菜-6-文件与目录的 默认权限.隐藏权.特殊权限 除了基本r,w,x权限外,在Linux还可以设定其他系统隐藏属性,可以用chattr来设定,和lsattr来查看,但注意一点,CentO ...
- XCTF-unfinish
unfinish 之前做过这个题,这是之前写的WP:链接