HOME 首页
SERVICE 服务产品
XINMEITI 新媒体代运营
CASE 服务案例
NEWS 热点资讯
ABOUT 关于我们
CONTACT 联系我们
创意岭
让品牌有温度、有情感
专注品牌策划15年

    lua内存泄漏排查(lua 内存泄漏检测)

    发布时间:2023-04-24 02:57:31     稿源: 创意岭    阅读: 64        

    大家好!今天让创意岭的小编来大家介绍下关于lua内存泄漏排查的问题,以下是小编对此问题的归纳整理,让我们一起来看看吧。

    开始之前先推荐一个非常厉害的Ai人工智能工具,一键生成原创文章、方案、文案、工作计划、工作报告、论文、代码、作文、做题和对话答疑等等

    只需要输入关键词,就能返回你想要的内容,有小程序、在线网页版、PC客户端和批量生成器

    官网:https://ai.de1919.com

    本文目录:

    lua内存泄漏排查(lua 内存泄漏检测)

    调用一个动态库中的函数,这个函数有一个参数是结构体指针,我如何使用这个指针?

    你就也定义一个形参中的结构体指针接收传过来的结构体指针就OK啦
    形参中的结构体指针改变?这什么意思?
    给你看个例子吧:
    struct node *creat(struct node *l)
    {
    struct node *head;
    head=l;
    return head;
    }
    你是这样吗~追问

    就是主程序中定义了一个结构体指针1,将其作为形参传递给某个调用函数,在函数内部又给这个形参赋值了一个结构体指针2,这样这个形参结构体指针1指向的地址就发生了改变,那在主程序中它的地址也改变么?我怎么发现他指向的地址没有改变呢?这样我怎么能够使用调用函数中的那个结构体指针2呢?
    PS:调用函数的返回类型已经确定,所以这个结构体指针必须作为形参来传递

    追答

    不能说是给这个形参赋值了一个结构体指针2,而是应该说用以个结构体指针2接收形参
    地址是没变啊 你的做法是将结构体指针2指向你传过来的结构体指针1的地址,所以指针1 2所指向的地址是相同的
    你把结构体指针2返回就可以啦

    追问

    我是想让结构体指针1的地址改变成结构体指针2的地址,并且struct *p1=shtrcut *p2是将p1指向了p2的地址吧?形参p1地址改变了,这样是对的吧?

    lua for 循环 内存占用扩大

    Lua 会自行管理回收内存。你上面这段代码不会有内存泄漏。
    至于你退出这个脚本后,free显示的数值如果维持在原来的数值而没有减少,那是因为Linux有它自己的策略来管理内存。如果退出脚本后,free显示的占用内存还在增大,可能是其它某个软件在使用和分配内存。
    你根本就不必理会Lua的内存释放,它自己会工作都非常好。
    内存泄漏一般有可能出现在一些开发有缺陷的扩展模块上。Lua本身是不会有问题的。追问

    您好,是在退出脚本后会释放,能否在中间就进行内存的释放呢?谢谢

    追答

    99%的情况不用。
    所有的脚本语言都会自己管理好内存。
    但如果是第三方写的扩展,就取决于这个扩展是不是有bug导致内存泄漏了。
    至于Linux,就更不用说了。假如你有512M的内存,跑http服务的话,你用free经常看到只剩下20M左右的空闲内存,但Linux系统会工作得很好。而有时Linux又会突然“真正”释放内存,free里面又显示出有100M左右的空闲内存。
    存储管理是操作系统的核心任务之一,它是动态管理,普通用户根本就不用关心。

    为什么lua语言中使用全局变量就会造成内存泄漏

    题目说法本身不正确.
    全局变量不一定造成内存泄露,只是可能导致多线程不安全。在创建多个lua虚拟机的时候会2个线程同时操作一个变量。这是你代码设计问题
    如果一定导致内存泄露,那么就不可能存在全局变量了.

    lua内存泄漏排查(lua 内存泄漏检测)

    为什么lua语言中使用全局变量就会造成内存泄漏呢??

    导致多线程不安全。不一定会造成泄露。在创建多个lua虚拟机的时候会2个线程同时操作一个变量。这是你代码设计问题
    至于如何发现内存泄漏,也简单说一下,如果是陌生代码,或者虽然是你的,但你也懒得猜哪里泄漏了,那么请参考云风的泄漏检查工具: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(泄漏对象的引用),即可找到一切非局部变量的归属关系。
    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

    以上就是关于lua内存泄漏排查相关问题的回答。希望能帮到你,如有更多相关问题,您也可以联系我们的客服进行咨询,客服也会为您讲解更多精彩的知识和内容。


    推荐阅读:

    illustrator提高教程(illustrator 教程)

    苹果6splus官方参数表(苹果6splus参数详细参数配置)

    andlua源码大全

    微信公众号投稿赚钱是真的吗

    牛肉馆logo图片