javascript|教程|網頁
最近做一個公司的業務系統,公司要求能儘可能的與c/s近似,也就是如c/s一樣,點擊文字框可以彈出此項目的相關內容,進行選擇輸入。
我使用了快顯視窗,然後在子視窗雙擊選中項目,把選中的值返回給父表單。
在系統做完了之後,在客戶使用的過程,由於客戶使用的是512m的記憶體配置,所以在開啟了30--40個表單之後,ie的虛擬記憶體佔用量達到近200m,從而使系統變慢,javascript的運行也變慢了。
我使用工作管理員,開啟一個快顯視窗,ie記憶體就增加1-3m,然後關閉視窗,有時記憶體並不釋放,有時才釋放幾十k。看來問題出在了記憶體釋放上面。
接著按記憶體釋放這個思路,進行搜尋尋找方法,來進行解決這個問題。我找到一個javascript未公開的函數CollectGarbage,這個函數是用來進行記憶體釋放的。我在所有的快顯視窗結束之前把所有的自己定義的javasctip的變數設定為null,並調用CollectGarbage函數。
javascript中把變數設為null,javascript並不會把記憶體釋放,當下次再次定義變數時,就會覆蓋此變數所在的記憶體。如果不設為null,javascript再次定義變數時,會開闢一個新的記憶體空間。
在使用以上處理之後,再次開啟視窗,ie的記憶體每次還是增加1-3m,但是在關閉視窗之後,則ie會釋放一定數量的記憶體在500k至2m。起到了一定的作用。
由於我在頁面中使用了第三方的控制項,第三方的控制項中的javascript中的記憶體是如何管理,就不是由我來控制的了。
1.javascript記憶體釋放的方法樣本
把所有上級函數的參數即使設為null,並使用CollectGarbage來釋放記憶體。
樣本
<script>
//32M
function AllocMem()
{
var str="12345678";
for(var i=3;i<24;i++)
str+=str;
return str;
}
function A(a)
{
a=null;
return r;
function r()
{
}
}
var f=A(AllocMem());
alert(1);
CollectGarbage();
//明顯,已經釋放了。
r=null;
alert(2);
CollectGarbage();
</script>
裡面對於記憶體釋放的規則(指令碼層)已經理解得很透了。
(每一層菜單分配?M的記憶體.對著工作管理員才看到情況)
注:
CollectGarbage()通常會在核心推出記憶體,因就是IE或NS程式結束的時候才會調用.這樣才是安全的
說明:
1) 如果你在另一個window中keep了該window中的object的reference,即使關閉該window,記憶體也沒有釋放
As you might know, windows opened with window.open() may share a process with its opener (_blank or _new window may not). That is, even if you see those two windows on the desktop, if you look at the process table in the Task Manager, you may only see one IEXPLORE.EXE running. Memory may only be released when the process is terminated
2)更糟糕的是,如果你keep的是一個DOM object的reference, 關閉該object 所在window, IE會crash, 報記憶體錯誤(或者要求,重新啟動)
I would say this looks like a bug, you might want to report to Microsoft