最近項目存在嚴重的內存泄漏問題,每次切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