HOME 首頁(yè)
SERVICE 服務(wù)產(chǎn)品
XINMEITI 新媒體代運(yùn)營(yíng)
CASE 服務(wù)案例
NEWS 熱點(diǎn)資訊
ABOUT 關(guān)于我們
CONTACT 聯(lián)系我們
創(chuàng)意嶺
讓品牌有溫度、有情感
專(zhuān)注品牌策劃15年

    lua內(nèi)存泄漏排查(lua 內(nèi)存泄漏檢測(cè))

    發(fā)布時(shí)間:2023-04-24 02:57:31     稿源: 創(chuàng)意嶺    閱讀: 64        

    大家好!今天讓創(chuàng)意嶺的小編來(lái)大家介紹下關(guān)于lua內(nèi)存泄漏排查的問(wèn)題,以下是小編對(duì)此問(wèn)題的歸納整理,讓我們一起來(lái)看看吧。

    開(kāi)始之前先推薦一個(gè)非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計(jì)劃、工作報(bào)告、論文、代碼、作文、做題和對(duì)話答疑等等

    只需要輸入關(guān)鍵詞,就能返回你想要的內(nèi)容,有小程序、在線網(wǎng)頁(yè)版、PC客戶端和批量生成器

    官網(wǎng):https://ai.de1919.com。

    本文目錄:

    lua內(nèi)存泄漏排查(lua 內(nèi)存泄漏檢測(cè))

    調(diào)用一個(gè)動(dòng)態(tài)庫(kù)中的函數(shù),這個(gè)函數(shù)有一個(gè)參數(shù)是結(jié)構(gòu)體指針,我如何使用這個(gè)指針?

    你就也定義一個(gè)形參中的結(jié)構(gòu)體指針接收傳過(guò)來(lái)的結(jié)構(gòu)體指針就OK啦
    形參中的結(jié)構(gòu)體指針改變?這什么意思?
    給你看個(gè)例子吧:
    struct node *creat(struct node *l)
    {
    struct node *head;
    head=l;
    return head;
    }
    你是這樣嗎~追問(wèn)

    就是主程序中定義了一個(gè)結(jié)構(gòu)體指針1,將其作為形參傳遞給某個(gè)調(diào)用函數(shù),在函數(shù)內(nèi)部又給這個(gè)形參賦值了一個(gè)結(jié)構(gòu)體指針2,這樣這個(gè)形參結(jié)構(gòu)體指針1指向的地址就發(fā)生了改變,那在主程序中它的地址也改變么?我怎么發(fā)現(xiàn)他指向的地址沒(méi)有改變呢?這樣我怎么能夠使用調(diào)用函數(shù)中的那個(gè)結(jié)構(gòu)體指針2呢?
    PS:調(diào)用函數(shù)的返回類(lèi)型已經(jīng)確定,所以這個(gè)結(jié)構(gòu)體指針必須作為形參來(lái)傳遞

    追答

    不能說(shuō)是給這個(gè)形參賦值了一個(gè)結(jié)構(gòu)體指針2,而是應(yīng)該說(shuō)用以個(gè)結(jié)構(gòu)體指針2接收形參
    地址是沒(méi)變啊 你的做法是將結(jié)構(gòu)體指針2指向你傳過(guò)來(lái)的結(jié)構(gòu)體指針1的地址,所以指針1 2所指向的地址是相同的
    你把結(jié)構(gòu)體指針2返回就可以啦

    追問(wèn)

    我是想讓結(jié)構(gòu)體指針1的地址改變成結(jié)構(gòu)體指針2的地址,并且struct *p1=shtrcut *p2是將p1指向了p2的地址吧?形參p1地址改變了,這樣是對(duì)的吧?

    lua for 循環(huán) 內(nèi)存占用擴(kuò)大

    Lua 會(huì)自行管理回收內(nèi)存。你上面這段代碼不會(huì)有內(nèi)存泄漏。
    至于你退出這個(gè)腳本后,free顯示的數(shù)值如果維持在原來(lái)的數(shù)值而沒(méi)有減少,那是因?yàn)長(zhǎng)inux有它自己的策略來(lái)管理內(nèi)存。如果退出腳本后,free顯示的占用內(nèi)存還在增大,可能是其它某個(gè)軟件在使用和分配內(nèi)存。
    你根本就不必理會(huì)Lua的內(nèi)存釋放,它自己會(huì)工作都非常好。
    內(nèi)存泄漏一般有可能出現(xiàn)在一些開(kāi)發(fā)有缺陷的擴(kuò)展模塊上。Lua本身是不會(huì)有問(wèn)題的。追問(wèn)

    您好,是在退出腳本后會(huì)釋放,能否在中間就進(jìn)行內(nèi)存的釋放呢?謝謝

    追答

    99%的情況不用。
    所有的腳本語(yǔ)言都會(huì)自己管理好內(nèi)存。
    但如果是第三方寫(xiě)的擴(kuò)展,就取決于這個(gè)擴(kuò)展是不是有bug導(dǎo)致內(nèi)存泄漏了。
    至于Linux,就更不用說(shuō)了。假如你有512M的內(nèi)存,跑http服務(wù)的話,你用free經(jīng)??吹街皇O?0M左右的空閑內(nèi)存,但Linux系統(tǒng)會(huì)工作得很好。而有時(shí)Linux又會(huì)突然“真正”釋放內(nèi)存,free里面又顯示出有100M左右的空閑內(nèi)存。
    存儲(chǔ)管理是操作系統(tǒng)的核心任務(wù)之一,它是動(dòng)態(tài)管理,普通用戶根本就不用關(guān)心。

    為什么lua語(yǔ)言中使用全局變量就會(huì)造成內(nèi)存泄漏

    題目說(shuō)法本身不正確.
    全局變量不一定造成內(nèi)存泄露,只是可能導(dǎo)致多線程不安全。在創(chuàng)建多個(gè)lua虛擬機(jī)的時(shí)候會(huì)2個(gè)線程同時(shí)操作一個(gè)變量。這是你代碼設(shè)計(jì)問(wèn)題
    如果一定導(dǎo)致內(nèi)存泄露,那么就不可能存在全局變量了.

    lua內(nèi)存泄漏排查(lua 內(nèi)存泄漏檢測(cè))

    為什么lua語(yǔ)言中使用全局變量就會(huì)造成內(nèi)存泄漏呢??

    導(dǎo)致多線程不安全。不一定會(huì)造成泄露。在創(chuàng)建多個(gè)lua虛擬機(jī)的時(shí)候會(huì)2個(gè)線程同時(shí)操作一個(gè)變量。這是你代碼設(shè)計(jì)問(wèn)題
    至于如何發(fā)現(xiàn)內(nèi)存泄漏,也簡(jiǎn)單說(shuō)一下,如果是陌生代碼,或者雖然是你的,但你也懶得猜哪里泄漏了,那么請(qǐng)參考云風(fēng)的泄漏檢查工具:http://blog.codingnow.com/2012/12/lua_snapshot.html
    如果代碼的大體邏輯比較熟悉,則可以使用弱引用表來(lái)檢查是否存在泄漏。通常產(chǎn)生泄漏的都是一些被反復(fù)創(chuàng)建的類(lèi)型,例如游戲里的怪物(打死了就刷一個(gè)新的)、玩家(有人登錄就要?jiǎng)?chuàng)建一個(gè)新的玩家對(duì)象),這些東西由于在程序運(yùn)行周期里反復(fù)地創(chuàng)建、銷(xiāo)毀,所以一旦有銷(xiāo)毀不干凈的情況,就容易導(dǎo)致明顯的內(nèi)存泄漏。那么探查這些對(duì)象是否存在泄漏,就有一個(gè)較為簡(jiǎn)單的辦法,即:弱引用表。(如果你不知道什么是弱引用,請(qǐng)點(diǎn)擊這里)。
    為了發(fā)現(xiàn)內(nèi)存泄漏,我們可以創(chuàng)建一個(gè)全局的弱引用table,使其key為弱引用,然后在每次創(chuàng)建那些可能存在泄漏的對(duì)象的時(shí)候,都放入這個(gè)table,讓其作為key,value通常我會(huì)用當(dāng)前時(shí)間。由于弱引用的性質(zhì),如果其他引用都消失了,那么在弱引用table中對(duì)這個(gè)對(duì)象的引用也會(huì)消失(變成nil),反之,只要還有其它任何一個(gè)引用存在,這個(gè)弱引用表中對(duì)這個(gè)對(duì)象的引用就繼續(xù)存在。依賴這個(gè)特性,當(dāng)程序已經(jīng)跑過(guò)釋放對(duì)象的邏輯后,如果這個(gè)表中還存在有這個(gè)對(duì)象的引用,那么這個(gè)對(duì)象肯定就是泄漏了。
    說(shuō)完了發(fā)現(xiàn)泄漏的方法,接下來(lái)輪到如何解決。其實(shí)我本來(lái)也想嘗試一下云大的snapshot,奈何這個(gè)項(xiàng)目用的是luajit,莫名其妙地不能require,時(shí)間緊迫,無(wú)法研究,只好作罷,另尋他法。不料一頓google下來(lái)除了snapshot之外幾乎沒(méi)有一個(gè)像樣的解決方案。情急之下,只好研究原理,自己動(dòng)手,下面請(qǐng)看干貨:
    既然內(nèi)存泄漏一定有引用沒(méi)清,那么基于lua的特性,這個(gè)引用一定存在于_G下面的某個(gè)table或者function的upvalue中(想不明白這個(gè)的同學(xué)請(qǐng)想明白再往下看),既然第一步的方法可以定位泄漏,而且還可以得到泄漏對(duì)象的引用,那么事情就好辦多了。無(wú)非就是得到引用之后遍歷_G,找到這個(gè)引用,并且把層級(jí)列出來(lái),方便知道這個(gè)東西到底在哪里,想解決就好辦的多了。實(shí)現(xiàn)方法就不多說(shuō)了,看代碼最直接。下面代碼中,調(diào)用findObjectInGlobal(泄漏對(duì)象的引用),即可找到一切非局部變量的歸屬關(guān)系。
    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

    以上就是關(guān)于lua內(nèi)存泄漏排查相關(guān)問(wèn)題的回答。希望能幫到你,如有更多相關(guān)問(wèn)題,您也可以聯(lián)系我們的客服進(jìn)行咨詢,客服也會(huì)為您講解更多精彩的知識(shí)和內(nèi)容。


    推薦閱讀:

    illustrator提高教程(illustrator 教程)

    蘋(píng)果6splus官方參數(shù)表(蘋(píng)果6splus參數(shù)詳細(xì)參數(shù)配置)

    andlua源碼大全

    微信公眾號(hào)投稿賺錢(qián)是真的嗎

    牛肉館logo圖片