DWR內(nèi)存兼容及無法調(diào)用問題解決方案
在上次遇到DWR內(nèi)存泄漏問題后根據(jù)網(wǎng)上的內(nèi)容對(duì)JS文件進(jìn)行修改,修改后發(fā)現(xiàn)還有一些兼容的問題,同時(shí)還出現(xiàn)不能調(diào)用的一些情況。
而且根據(jù)統(tǒng)計(jì)DWR就算內(nèi)存泄漏,也不是特別嚴(yán)重,除非你一個(gè)瀏覽器跑幾天不關(guān)閉,而且實(shí)時(shí)刷新!
經(jīng)過再次查詢,得知IE瀏覽器有自己的一個(gè)垃圾回收的函數(shù):CollectGarbage();
CollectGarbage,是IE的一個(gè)特有屬性,用于釋放內(nèi)存的使用方法嘛應(yīng)該是,將該變量或引用對(duì)象,設(shè)置為null或delete
然后在進(jìn)行釋放動(dòng)作在做CollectGarbage前,要必需清楚的兩個(gè)必備條件:
引用
- 一個(gè)對(duì)象在其生存的上下文環(huán)境之外,即會(huì)失效。
- 一個(gè)全局的對(duì)象在沒有被執(zhí)用(引用)的情況下,即會(huì)失效。
對(duì)于對(duì)象何時(shí)失效,有這樣的一些解釋:
function testObject() { var _obj1 = new Object(); } function testObject2() { var _obj2 = new Object(); return _obj2; } // 示例1 testObject(); // 示例2 testObject2() // 示例3 var obj3 = testObject2(); obj3 = null; // 示例4 var obj4 = testObject2(); var arr = [obj4]; obj3 = null; arr = [];
在這四個(gè)示例中:
- “示例1”在函數(shù)testObject()中構(gòu)造了_obj1,但是在函數(shù)退出時(shí),它就已經(jīng)離開了函數(shù)的上下文環(huán)境,因此_obj1失效了;
- “示例2”中,testObject2()中也構(gòu)造了一個(gè)對(duì)象_obj2并傳出,因此對(duì)象有了“函數(shù)外”的上下文環(huán)境(和生存周期),然而由于函數(shù)
的返回值沒有被其它變量“持有”,因此_obj2也立即失效了;
- “示例3”中,testObject2()構(gòu)造的_obj2被外部的變量obj3持用了,這時(shí),直到“obj3=null”這行代碼生效時(shí),_obj2才會(huì)因?yàn)橐藐P(guān)系消失而失效。
- 與示例3相同的原因,“示例4”中的_obj2會(huì)在“arr=[]”這行代碼之后才會(huì)失效。
另外我發(fā)現(xiàn)許多人都說了這樣一句話:
最后之最后,關(guān)于GC的一個(gè)補(bǔ)充說明:在IE窗體被最小化時(shí),IE將會(huì)主動(dòng)調(diào)用一次CollectGarbage()函數(shù)。這使得IE窗口在最小化之后,內(nèi)存占用會(huì)有明顯改善。
我只能說,調(diào)用CollectGarbage()函數(shù)會(huì)有意外的收獲,但是他不是萬能的,也不是調(diào)用就能釋放內(nèi)存更不是說調(diào)用后和將瀏覽器最小化一次的效果一樣。
我們是每秒五次刷新,每次刷新點(diǎn)有一百多處,這樣瀏覽器的DOM始終是在增加和更新東西。算下來,就是跑一個(gè)小時(shí)也是有很大消耗的。
更何況我們的軟件要跑在一個(gè)定制的機(jī)器上,發(fā)現(xiàn)這個(gè)機(jī)器的硬件有兼容問題,我們將瀏覽器更新到IE7.0,進(jìn)行數(shù)據(jù)實(shí)時(shí)刷新后發(fā)現(xiàn),內(nèi)存一直增長,直到瀏覽器崩潰。但是不同機(jī)器崩潰的時(shí)機(jī)不同。
我在每次更新后調(diào)用垃圾回收函數(shù),發(fā)現(xiàn)瀏覽器的內(nèi)存仍在增加,但是間隔的有增有加,雖然總體還是在增加。由此,我們在那個(gè)機(jī)器上跑了十幾個(gè)小時(shí),瀏覽器內(nèi)存沒有超過50M。
很少有那個(gè)頁面會(huì)這樣大量的刷新,并跑這么長時(shí)間吧,可是我們遇到了。
把問題歸咎與DWR我發(fā)現(xiàn)不是很合理,至少現(xiàn)在我這么覺得,但是對(duì)于頁面有大量刷新和需要長時(shí)間運(yùn)行這個(gè)需求來說,我覺得還是需要深入研究一下的。
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
微信小程序canvas開發(fā)水果老虎機(jī)的思路詳解
這篇文章主要介紹了微信小程序canvas開發(fā)水果老虎機(jī)的思路,本文通過思路代碼分步驟給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02js unicode 編碼解析關(guān)于數(shù)據(jù)轉(zhuǎn)換為中文的兩種方法
這篇文章主要介紹了js unicode 編碼解析關(guān)于數(shù)據(jù)轉(zhuǎn)換為中文的兩種方法,需要的朋友可以參考下2014-04-04關(guān)于預(yù)加載InstantClick的問題解決方法
本篇文章主要介紹了關(guān)于預(yù)加載InstantClick的問題解決方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-09-09JavaScript中判斷為整數(shù)的多種方式及保留兩位小數(shù)的方法
這篇文章主要介紹了JavaScript中判斷為整數(shù)的多種方式,以及保留兩位小數(shù)的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09axios使用攔截器統(tǒng)一處理所有的http請求的方法
這篇文章主要介紹了axios使用攔截器統(tǒng)一處理所有的http請求的方法,通過一段實(shí)例代碼給大家介紹了axios攔截器使用,代碼簡單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-11-11