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

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

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

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

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

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

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

    本文目錄:

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

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

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

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

    追答

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

    追問

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

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

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

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

    追答

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

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

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

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

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

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


    推薦閱讀:

    illustrator提高教程(illustrator 教程)

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

    andlua源碼大全

    微信公眾號投稿賺錢是真的嗎

    牛肉館logo圖片