一区二区三区电影_国产伦精品一区二区三区视频免费_亚洲欧美国产精品va在线观看_国产精品一二三四

聯(lián)系我們 - 廣告服務(wù) - 聯(lián)系電話:
您的當前位置: > 關(guān)注 > > 正文

全球關(guān)注:如何玩轉(zhuǎn)Lua內(nèi)存回收?Lua的內(nèi)存監(jiān)測和回收

來源:CSDN 時間:2023-01-03 07:41:59
Lua內(nèi)存是自動收集的,?這點跟Java類似,?不被任何對象或全局變量引用的數(shù)據(jù),將被首先標記為回收,不需要開發(fā)者做任何事情.但是,正如Java也會有內(nèi)存泄露一樣, Lua也會有,?只不過,跟C++的不同,它是由于代碼執(zhí)行所裝載的資源,并沒有被徹底銷毀而導(dǎo)致,其中,最臭名昭著的就是不小心把局部變量聲明成了全局變量(忘了加local修飾符)。?類似這樣造成的內(nèi)存泄露,?跟任何其他語言的內(nèi)存泄露一樣,容易產(chǎn)生,卻難以察覺,?給開發(fā)的應(yīng)用帶來潛在的很大隱患.

那么,?有沒有一些有效的解決辦法,?來解決這個這個隱患呢,?答案就是collectgarbage. collectgarbage就是開放給Lua開發(fā)人員,?用于監(jiān)聽Lua的內(nèi)存使用情況(collectgarbage("count")),?同時,它還提供了collectgarbage("collect"),允許在適當?shù)臅r候進行顯式的回收.


(資料圖)

現(xiàn)在,通過測試代碼來看看,如何玩轉(zhuǎn)collectgarbage.

首先,為了有明顯的對比,?先來看沒有產(chǎn)生泄露的情況,?運行以下的test1(代碼如下):

運行結(jié)果如下:

這里看到,?被local?聲明的colen加了5000數(shù)組, test1調(diào)用后,?內(nèi)存增加了大概300K(25906K-25620K). 現(xiàn)在,我們來做內(nèi)存回收(調(diào)用mem函數(shù),?代碼如下): ?運行結(jié)果: (?為了保證內(nèi)存的穩(wěn)定,以上注意mem被調(diào)用了多次,?再第2次,?可以看到內(nèi)存開始下降,?最后,大概在25618K穩(wěn)定下來) ?好了,? 從最初的 25620K,? 到回收后的 25618K,? 兩者并沒有發(fā)生變化(還少了2K,嘿嘿, 這應(yīng)該是誤差了),?也就是說,函數(shù)test1的執(zhí)行,并沒有產(chǎn)生無法回收的內(nèi)存,沒有泄露出現(xiàn).

好了,現(xiàn)在運行有泄露的test2(代碼如下), test2跟test1相比,只有一處不同:就是colen被誤聲明為全局:

結(jié)果:

也就是說,內(nèi)存也在25906K,跟test1幾乎是相等,?好了,現(xiàn)在再調(diào)用回收(mem)函數(shù),產(chǎn)生結(jié)果如下 ?為了保證函數(shù)回收被執(zhí)行,這次,總共調(diào)用了7次mem函數(shù)(看以上打印行數(shù)),?那么,從上面的結(jié)果我們看,?很不幸,?從第1次,到最后第7次,?內(nèi)存都還是穩(wěn)定在25905K左右,?也就是說,?跟調(diào)用test2前相比,即使Lua進行了內(nèi)存回收,?內(nèi)存卻不會將下來? 看來 ,? 這 300K(25906K-25620K) 內(nèi)存 ,? 由于已放到了全局函數(shù)中,是永遠沒有機會被回收到了!

總結(jié)一:?如何監(jiān)測Lua的編程產(chǎn)生內(nèi)存泄露:

1.???????針對會產(chǎn)生泄露的函數(shù),先調(diào)用collectgarbage("count"),取得最初的內(nèi)存使用

2.???????函數(shù)調(diào)用后, collectgarbage("collect")進行收集,?并使用collectgarbage("count")再取得當前內(nèi)存,?最后記錄兩次的使用差

3.???????從test1的收集可看到, collectgarbage("collect")被調(diào)用,并不保證一次成功,?所以,?大可以調(diào)用多次

總結(jié)二:?如何避免Lua應(yīng)用中出現(xiàn)的內(nèi)存使用過大行為:

1.???????當然是代碼實現(xiàn)不出現(xiàn)泄露, (廢話*&%$()

2.???????在測試中,其實還發(fā)現(xiàn), Lua中被分配的內(nèi)存,其實并不會自動回收(個人估計要么就是Lua虛擬機沒有做這個事情,要么就是回收的時機是在C層),?所以,?為了避免內(nèi)存過大,?應(yīng)用的運行時,可能需要定期的(調(diào)用collectgarbage("collect"),又或者collectgarbage("step"))進行顯式回收。

大小: 2.7 KB 大小: 6.3 KB 大小: 4.6 KB 大小: 5.7 KB 大小: 9.2 KB 大小: 2.3 KB 大小: 2.3 KB
責任編輯:

標簽:

相關(guān)推薦:

精彩放送:

新聞聚焦
Top 主站蜘蛛池模板: 辛集市| 清徐县| 买车| 德江县| 合阳县| 墨江| 织金县| 景宁| 珠海市| 黄梅县| 兴义市| 高邮市| 垦利县| 宿州市| 罗山县| 台安县| 湘阴县| 镇远县| 阜新市| 理塘县| 息烽县| 固原市| 虹口区| 保亭| 林西县| 南阳市| 富顺县| 定州市| 综艺| 沙田区| 三台县| 保山市| 汝阳县| 陵水| 湖南省| 新绛县| 驻马店市| 武邑县| 黎川县| 额尔古纳市| 长岛县|