Lua内存泄漏应对方法

【51单片机实物】基于51单片机设计的简易直流电机调测速系统(可用在普中开发板) 功能任务描述:将设置的转速与当前测量的转速比较,得出差值用于控制DAC0832的输出电压,从而控制直流电机的转速,使转速逐渐达到设置转速。在LED上显示设置转速(左2位LED)和当前转速(右2位LED),转速显示采用十进制。控制过程中,当前转速显示不断变化。*直流电机转速范围0-96r/s,误差±1r/s 阅读详情

    结合之前的Lua内存检测原理这篇文章来看,下面这篇文章是这个原理的部分实现与应用。有代码真的好,让你快速了解。

   由于目前正在负责的项目是一个二次开发项目,而且留给我们的代码质量实在让人无力吐槽,所以遇到了不少大大小小的坑,好在慢慢都淌过去了。最近就遇到了一个内存泄漏的问题,泄漏发生在lua里,项目代码里以前的开发团队留下了检测泄漏的代码,但也仅限于此。由于代码量庞大,所以想从逻辑上梳理清楚哪里的引用没干掉导致了内存泄漏几乎就是大海捞针。好在解决的过程比较顺利,这篇文章就来谈一谈Lua中如何解决内存泄漏的问题。

至于如何发现内存泄漏,也简单说一下,如果是陌生代码,或者虽然是你的,但你也懒得猜哪里泄漏了,那么请参考云风的泄漏检查工具:http://blog.codingnow.com/2012/12/lua_snapshot.html

    如果代码的大体逻辑比较熟悉,则可以使用弱引用表来检查是否存在泄漏。通常产生泄漏的都是一些被反复创建的类型,例如游戏里的怪物(打死了就刷一个新的)、玩家(有人登录就要创建一个新的玩家对象),这些东西由于在程序运行周期里反复地创建、销毁,所以一旦有销毁不干净的情况,就容易导致明显的内存泄漏。那么探查这些对象是否存在泄漏,就有一个较为简单的办法,即:弱引用表。(如果你不知道什么是弱引用,请点击这里)。

为了发现内存泄漏,我们可以创建一个全局的弱引用table,使其key为弱引用,然后在每次创建那些可能存在泄漏的对象的时候,都放入这个table,让其作为key,value通常我会用当前时间。由于弱引用的性质,如果其他引用都消失了,那么在弱引用table中对这个对象的引用也会消失(变成nil),反之,只要还有其它任何一个引用存在,这个弱引用表中对这个对象的引用就继续存在。依赖这个特性,当程序已经跑过释放对象的逻辑后,如果这个表中还存在有这个对象的引用,那么这个对象肯定就是泄漏了。

    说完了发现泄漏的方法,接下来轮到如何解决。其实我本来也想尝试一下云大的snapshot,奈何这个项目用的是luajit,莫名其妙地不能require,时间紧迫,无法研究,只好作罢,另寻他法。不料一顿google下来除了snapshot之外几乎没有一个像样的解决方案。情急之下,只好研究原理,自己动手,下面请看干货:

    既然内存泄漏一定有引用没清,那么基于lua的特性,这个引用一定存在于_G下面的某个table或者function的upvalue中(想不明白这个的同学请想明白再往下看),既然第一步的方法可以定位泄漏,而且还可以得到泄漏对象的引用,那么事情就好办多了。无非就是得到引用之后遍历_G,找到这个引用,并且把层级列出来,方便知道这个东西到底在哪里,想解决就好办的多了。实现方法就不多说了,看代码最直接。下面代码中,调用findObjectInGlobal(泄漏对象的引用),即可找到一切非局部变量的归属关系。

 

<span style="font-size:14px;">    local findedObjMap = nil   
    function _G.findObject(obj, findDest)  
        if findDest == nil then  
            return false  
        end  
        if findedObjMap[findDest] ~= nil then  
            return false  
        end  
        findedObjMap[findDest] = true  
      
        local destType = type(findDest)  
        if destType == "table" then  
            if findDest == _G.CMemoryDebug then  
                return false  
            end  
            for key, value in pairs(findDest) do  
                if key == obj or value == obj then  
                    _info("Finded Object")  
                    return true  
                end  
                if findObject(obj, key) == true then  
                    _info("table key")  
                    return true  
                end  
                if findObject(obj, value) == true then  
                    _info("key:["..tostring(key).."]")  
                    return true  
                end  
            end  
        elseif destType == "function" then  
            local uvIndex = 1  
            while true do  
                local name, value = debug.getupvalue(findDest, uvIndex)  
                if name == nil then  
                    break  
                end  
                if findObject(obj, value) == true then  
                    _info("upvalue name:["..tostring(name).."]")  
                    return true  
                end  
                uvIndex = uvIndex + 1  
            end  
        end  
        return false  
    end  
      
    function _G.findObjectInGlobal(obj)  
        findedObjMap = {}  
        setmetatable(findedObjMap, {__mode = "k"})  
        _G.findObject(obj, _G)  
    end  </span>

   原文地址:http://blog.youkuaiyun.com/xocoder/article/details/42685685
ssm框架搭建 这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载 立即下载

相关推荐

VFH避障/局部路径规划算法

VFH避障/局部路径规划算法 本文章是我看《The Vector Field Histogram-Fast Obstacle Avoidance for Mobile Robots》论文时候的笔记,感兴趣的欢迎去看原论文。 VFH中有一些概念是从其他算法中借鉴过来的,并且VFH算法本身就是对VFF(Virtural Force Field)的一种改进,其中有很多的相似之处。所以按照原论文的思路,先介绍由CMU提出的Certainty Grid算法中的一些概念,再介绍一下势场法中的一些概念,接着介绍一下VFF

qq_41845878的博客 8117

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

Lua会造成内存泄露的表征分析: #因素一:(实例型)实体资源的创建持有者和调用者,相互之间如果太过信任,那么对调用者就会形成过高的要求,创建者可以让任意的调用者进行任意的create,调用者消费后以为创建者会管理(销毁),但其实并非如此,比如有这样一个实体管理器xxxManager,它有接口createXXX/removeXXX, 那么,创建和销毁的权利都丢给了调用者,如果调用者光c...

没有银弹-colen的软件思考 380

手把手教你为STM32设备生成自定义MAC地址(基于芯片ID的5种算法对比)

本文详细介绍了基于STM32芯片ID生成自定义MAC地址的5种算法,包括直接截取、异或折叠、CRC32哈希、自定义混合运算及SHA-256摘要。通过对比分析各算法的计算复杂度、唯一性及适用场景,帮助嵌入式开发者根据项目规模与资源,选择最合适的方案,确保设备MAC地址的唯一性与合规性。

weixin_29170327的博客 527

写 lua 脚本时遇到的内存泄漏案例

从开始用lua到现在,也有一年多时间,作为脚本语言,很简单,基本属于1天入门,3天熟练,5天精通; 从接触lua起,就有固定的思维模式:这是一门自动化内存管理的脚本语言; 于是乎,我自然而然地认为,lua不会存在内存泄漏的问题; 直到我自己写出内存泄漏的lua代码。。。 --示例 --先声明,我知道发生了内存泄漏,但我并不知道内部是什么原理导致泄漏 --[[ --表形式如下 local t = { person={ name=xxx, age=xxx,

摔断翅膀的鸟人 964

A Side Scan Sonar Image Denoising Algorithm Based on Compound of Fuzzy Weighted Average and Kalman F

Abstract 水下侧扫声纳图像的噪声来源:高斯噪声、脉冲、斑点噪声。 传统方法只能移除部分噪声,并且去噪后容易造成细节模糊。 本文在考虑到噪声的随机性以后,提出一种融合了模糊加权平均和卡尔曼滤波的去噪方法。 在最大化保留图像细节的基础上,同时去除高斯噪声和脉冲噪声 一.Introduction 由于海底环境和声波自身干涉的影响,声纳图像生成的图像难免会有噪点。声纳采集的图像通常会有高斯噪声、脉...

qq_44516871的博客 927

特征选择(模型输入参数的分析选择)方法汇总

特征选择是模式识别和机器学习领域的重要研究课题之一。为了提高准确率, 人们往往最大限度地提取特征信息。然而, 过大的特征向量维数不仅导致计算成本的增加, 复杂运算也随之带来分类识别率的下降。因此, 通过合适的特征选择算法, 去除无关特征和冗余特征, 获得有助于分类的最优特征子集, 对提高识别性能和降低计算成本具有重要意义。 特征选择主要有两个功能: 减少特征数量、降维,使模型泛化能力更强,减少过拟合 增强对特征和特征值之间的理解 参考资料: 优快云《几种常用的特征选择方法》 知乎《机器学习中,.

David's Tweet 1万+

Lua代码内存泄漏的疑惑

1)Lua代码内存泄漏的疑惑 ​2)一个Lua重复加载后造成的泄露问题 3)关于Addressable中计数的疑惑 4)合并Mesh的插件推荐 这是第265篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间10分钟,认真读完必有收获。 UWA 问答社区:answer.uwa4d.com UWA QQ群2:793972859(原群已满员) Script Q:Lua Profiler提示调用红框中函数,每次都会增加大概0.23KB的内存,且随时间一直增加,请教一

UWA—简单优化,优化简单! 1087

【学习体会】Lighttools8.4.0:设置虚拟相机+仿真结果3D显示

1.设置虚拟相机并渲染视图中的图像 添加球型光源、接收器、cube物体,设置物体表面的光学属性为简单散射

LeonJin的博客 6282

线上故障之-内存问题

线上故障之-内存问题内存概述内存泄漏(Memory Leak)JAVA中的内存泄露:常见的容易导致内存泄露的点内存溢出(Out Of Memory)模拟内存溢出工具 内存概述 内存泄漏(Memory Leak) 是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。 一般内存泄露的方式: 常发性内存泄漏:发生内存泄漏的代码会被多次执行到,每次被执行时都会导致一块内存泄漏。 偶发性内存泄漏:发生内存泄漏的代码只有在某些特定环境或操作过程

m0_46690280的博客 3801

MapGIS地质剖面图绘制实战:从数据准备到整饰出图

本文详细解析了MapGIS地质剖面图绘制的全流程,从数据准备到整饰出图,涵盖了等高线处理、GRD格网化、比例尺控制等关键步骤。通过实战技巧和案例分析,帮助地质工作者高效完成专业地质剖面图绘制,提升矿产勘探和工程勘察的工作效率。

weixin_28335283的博客 592

【WRF后处理】基于wrf-python处理wrf运行结果wrfout_d01

基于wrf-python处理wrf运行结果wrfout_d01

WW、forever的博客 5209

Lua 怎么解决闭包内存泄漏问题

如果闭包不再需要访问外部变量,可以通过将闭包内的变量设置为 nil 来解除引用。这样,当外部变量没有其他引用时,垃圾回收器就可以回收它们。全局变量在 Lua 中是持久的,直到它们被显式地设置为 nil 或脚本结束。避免在闭包中意外地创建全局变量。尽量将变量定义为局部变量,而不是全局变量或表的字段,以减少它们被闭包意外捕获的机会。对于弱引用表的使用示例。

Morris-w的专栏 1139

倍福EL6002实现RS232自由口通信,以称重模块RS232数据接收为例

RS-232是美国电子工业联盟制定的串行数据通信接口标准,原始编号全称是EIA-RS-232(简称RS232),它被广泛用于DCE(Data Communication Equipment ) 和 DTE(Data Terminal Equipment) 之间的连接。最早的台式电脑都会保留9针的232接口,用于串口通信,目前基本被USB接口取代。CTS是对请求发送RTS信号的响应,当DCE已经准备好接收数据时,该信号有效(ON),通知DTE可用使用TXD发送数据了。弄完了,再将CTS设置为1,让A发数据。

weixin_41883890的博客 1724

Unity中MoonSharp Lua脚本高效调试:从环境搭建到性能优化实战

在游戏开发中,脚本语言如Lua因其热更新和灵活配置能力而被广泛应用,其核心原理是通过虚拟机解释执行,实现逻辑与引擎的松耦合。掌握脚本调试技术,能极大提升开发效率,确保游戏逻辑的稳定性和性能。本文聚焦于Unity生态下流行的MoonSharp Lua解释器,针对开发中常见的脚本错误、性能瓶颈和内存泄漏问题,提供一套完整的调试解决方案。通过配置VSCode与EmmyLua扩展,开发者可以实现源码级断点调试和变量查看,如同调试C#代码一样高效。文中深入剖析了“attempt to index a nil valu

cqwmy840702的博客 401

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【Lua】lua内存泄漏

我们游戏开始都是用c++写的,后来写了一半的时候加入了lua,现在有4个模块用lua写的逻辑,类对象都是在模拟器里面创建好,基于tolua将对象和相关方法导入到lua中,然后用lua实现逻辑部分。功能实现之后,昨天开始看看lua逻辑部分有没有内存泄漏,网上查了很多资料,边学习边查找。 luaMonitor这个工具还不错,可以看到lua使用的内存变化以及分配内存的变量和函数等,通过这个我看到我们代

wuhen334360的博客 1760

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

关于 Lua 内存泄漏的检测

引用:https://www.cnblogs.com/yaukey/p/unity_lua_memory_leak_trace.html   前一阵开始和同事一起优化内存,首先是优化 Lua 内存,因为发现每次战斗完后 Lua 内存非常大,从 3M 左右在经过了10次左右的战斗后,会暴增到近 100M,很明显是有内存泄漏。 然后我正式启动该工作,基本思路就是递归遍历内...

lishenglong666的专栏 2066

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

如何快速检测Lua内存泄漏?终极lua-snapshot工具使用指南

lua-snapshot是一款轻量级Lua内存快照工具,能帮助开发者生成虚拟机内存快照,轻松检测内存泄漏问题。本文将详细介绍这款工具的安装步骤、使用方法及最佳实践,让你快速掌握Lua内存调试技巧。 ## 一、认识lua-snapshot:Lua开发者的内存调试神器 lua-snapshot是专为Lua设计的内存快照工具,它可以在程序运行的特定时间点捕获Lua虚拟机的完整状态,并将其保存为二进制...

gitblog_00469的博客 1123

Lua GC调优与内存泄漏排查实战

本文介绍了Lua的垃圾回收(GC)机制及调优策略。Lua采用增量标记-清除GC,管理所有对象,其启动时机和步伐可调。调优核心参数包括setpause和setstepmul,可根据场景调整:内存紧张时降低pause提高stepmul;流畅优先时放宽pause。还提供了手动GC和不同场景的配置示例。针对内存泄漏问题,建议监控内存用量、使用弱引用表跟踪对象、检查全局变量,并介绍了luatrace等工具进行内存分析。最后强调要根据实际需求平衡GC策略,同时重视泄漏检测和资源释放。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 955

Lua弱引用表处理普通的内存泄漏

Lua中有垃圾回收机制(GC)的,支持GC的对象有五种string,table,function,full userdata,thread,理论上不会有内存泄漏,但是进行GC时,如果这个对象还有引用,则不会被GC,所以实际上Lua中的内存泄漏是指没有被使用,但是仍然存在引用的对象。 内存泄漏处理方法:使用弱引用表管理可能发生内存泄漏的对象 弱引用:是指不能确保其引用的对象不会被垃圾回收器回收的...

qq626928256的博客 676

[Lua] 内存泄漏与垃圾回收

转自:https://www.cnblogs.com/lyh916/p/7896072.html 一.内存泄漏的检测 Lua的垃圾回收是自动进行的,但是我们可以collectgarbage方法进行手动回收。collectgarbage方法的第一个参数是字符串,代表操作类型,第二个参数只有某些操作类型有,是该操作所需要的参数。常用的操作类型有: collect:执行一次完整的垃圾回收 cou...

Zzz的专栏 829

unity如何检测内存泄漏_lua内存泄漏检测工具原理及设计

然而,新增gc对象就代表内存泄漏?看下这段代码:local no_leak = {}function innocent()no_leak.a = {x = 1}no_leak.b = {y = 1}endinnocent函数每次执行都会新增两个table并持有它们,但这明显不是内存泄漏,而且这是很常见的写法。不新增gc对象就代表没内存泄漏?也不是:local local_leak = {}func...

weixin_42545664的博客 1243

【开源精粹】Lua快照:深入监测内存泄漏的利器

**Lua快照(lua-snapshot)** 是一个由C和Lua双语种编写的高效开源工具,旨在解决令开发者头疼的Lua状态内存泄漏问题。它通过为Lua状态创建精确的快照,提供了一种强大且直观的方式来探测和管理潜在的内存泄漏。 ## ???? 核心功能 - **内存快照机制**:lua-snapshot能够捕获当前Lua状态的完整内存布局,帮助开发者在不同时间点比较内存使用情况,从而定位可能的内存...

gitblog_00630的博客 544

xLua内存泄漏修复案例:Unity Lua项目的问题解决实例

在Unity游戏开发中,内存泄漏(Memory Leak)是一个常见且棘手的问题。尤其当项目采用xLua(Lua编程解决方案)进行开发时,C#与Lua两种语言的内存管理机制差异可能导致更复杂的内存泄漏场景。本文将通过一个真实案例,详细介绍如何诊断和修复xLua项目中的内存泄漏问题,帮助开发者掌握实用的分析方法和解决方案。 读完本文后,你将能够: - 理解xLua中内存泄漏的常见原因 - 掌握Un...

gitblog_00325的博客 685

lua内存泄漏问题

lua自身也有自己的垃圾回收机制 垃圾回收算法都是用的标记清扫方式,也就是说不管对象间的引用有多复杂,只要没有被对象根结点直接或间接引用,都是可以被当做垃圾清理掉。 所以我们要避免一些gc的操作和导致根节点的循环引用导致内存泄漏。 1.同样的如果需要释放的内容一定要记得在结束后设置为nil(这个比较基础) 2.避免匿名函数,每次执行匿名函数都会导致内存消耗,lua并没有去释放匿名函数。看一...

llsansun的博客 3345

Lua游戏内存泄漏检查

上一篇我们对Lua对象释放做了一些初步了解,那么在这一节中,我就简单介绍两种Lua内存泄漏检查的常用方法。 内存快照对于内存快照,目前用得最多的是云风大大开源在github上的snapshot库。原文链接它提供一个函数,可以对当前的 Lua State 做一个完整的快照,为了减少分析数据,只记录了复杂对象的引用关系。也就是记录记录下所有 table thread userdata function

canglangclient的博客 3098
上一篇: Lua的内存监测和回收
下一篇: 以自定义方式加载 lua 模块
cbbbc
博客等级 码龄15年 609粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值