You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
118 lines
2.8 KiB
118 lines
2.8 KiB
using UnityEngine;
|
|
using System;
|
|
using XLua;
|
|
|
|
public class LuaMemoryLeakCheckerTest : MonoBehaviour
|
|
{
|
|
LuaEnv luaenv = new LuaEnv();
|
|
Action update;
|
|
LuaMemoryLeakChecker.Data data = null;
|
|
|
|
void Start()
|
|
{
|
|
luaenv.DoString(@"
|
|
local local_leak = {}
|
|
global_leak = { a = {}}
|
|
--global_leak.a.b = global_leak
|
|
|
|
local no_leak = {}
|
|
|
|
function make_leak1()
|
|
table.insert(local_leak, 1)
|
|
table.insert(global_leak, {})
|
|
end
|
|
|
|
-- 会不断创建并持有新table,但其实没泄漏
|
|
function innocent()
|
|
no_leak.a = {x = 1}
|
|
no_leak.b = {y = 1}
|
|
end
|
|
", "@leak1.lua");
|
|
|
|
luaenv.DoString(@"
|
|
local anthor_leak = {a = {{ b = {}}}}
|
|
|
|
function make_leak2()
|
|
table.insert(anthor_leak.a[1].b, 1)
|
|
end
|
|
|
|
local t = 1
|
|
|
|
slow_global_leak = {}
|
|
|
|
debug.getregistry()['ref_anthor_leak'] = anthor_leak
|
|
|
|
function slow_leak()
|
|
if t == 40 then
|
|
t = 0
|
|
table.insert(slow_global_leak, {x = 0, y = 1})
|
|
else
|
|
t = t + 1
|
|
end
|
|
end
|
|
|
|
", "@leak2.lua");
|
|
|
|
luaenv.DoString(@"
|
|
shutdown_fast_leak = false
|
|
|
|
function update()
|
|
if not shutdown_fast_leak then
|
|
make_leak1()
|
|
make_leak2()
|
|
end
|
|
innocent()
|
|
slow_leak()
|
|
end
|
|
", "@main.lua");
|
|
|
|
luaenv.Global.Get("update", out update);
|
|
|
|
data = luaenv.StartMemoryLeakCheck();
|
|
Debug.Log("Start, PotentialLeakCount:" + data.PotentialLeakCount);
|
|
}
|
|
|
|
int tick = 0;
|
|
|
|
bool finished = false;
|
|
|
|
void Update()
|
|
{
|
|
if (!finished)
|
|
{
|
|
tick++;
|
|
update();
|
|
luaenv.Tick();
|
|
|
|
if (tick % 30 == 0)
|
|
{
|
|
data = luaenv.MemoryLeakCheck(data);
|
|
Debug.Log("Update, PotentialLeakCount:" + data.PotentialLeakCount);
|
|
}
|
|
|
|
if (tick % 180 == 0)
|
|
{
|
|
Debug.Log(luaenv.MemoryLeakReport(data));
|
|
|
|
if (tick == 180)
|
|
{
|
|
//假装解决了快速内存泄漏
|
|
luaenv.Global.Set("shutdown_fast_leak", true);
|
|
//开启一个新的泄漏检测
|
|
data = luaenv.StartMemoryLeakCheck();
|
|
}
|
|
else
|
|
{
|
|
finished = true;
|
|
Debug.Log("Finished");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void OnDestroy()
|
|
{
|
|
update = null;
|
|
luaenv.Dispose();
|
|
}
|
|
}
|
|
|