Artikel ini menjelaskan secara rinci waktu dan metode manajemen memori dan rilis oleh JavaScript dan IE Browser, berharap dapat membantu pengembang front-end.
Contoh rilis memori
Salinan kode adalah sebagai berikut:
<Bahasa skrip = "javascript">
<!-
strtest = "1";
untuk (var i = 0; i <25; i ++)
{
strtest += strtest;
}
waspada (strtest);
hapus strtest;
Collectgarbage ();
//->
</script>
Collectgarbage adalah properti unik dari IE, yang digunakan untuk melepaskan memori. Metode penggunaan harus: Atur variabel atau objek referensi ke null atau hapus, dan kemudian lakukan tindakan rilis.
Dua kondisi yang diperlukan harus jelas sebelum melakukan Collectgarbage:
Referensi - Suatu objek tidak valid di luar konteks di mana ia tinggal.
- Objek global akan tidak valid jika tidak dieksekusi (direferensikan).
Salinan kode adalah sebagai berikut:
// ---------------------------------------------------------
// Kapan objek JavaScript akan gagal
// ---------------------------------------------------------
function testObject () {
var _obj1 = objek baru ();
}
function testObject2 () {
var _obj2 = objek baru ();
mengembalikan _obj2;
}
// Contoh 1
testObject ();
// Contoh 2
testObject2 ()
// Contoh 3
var obj3 = testObject2 ();
obj3 = null;
// Contoh 4
var obj4 = testObject2 ();
var arr = [obj4];
obj3 = null;
arr = [];
Dalam empat contoh ini:
- "Contoh 1" Konstruksi _OBJ1 Dalam fungsi testObject (), tetapi ketika fungsi keluar, ia telah meninggalkan konteks fungsi, jadi _OBJ1 tidak valid;
- Dalam "Contoh 2", objek _OBJ2 juga dibangun di testObject2 () dan pingsan, sehingga objek memiliki lingkungan konteks (dan seumur hidup) "di luar fungsi", tetapi karena nilai pengembalian fungsi tidak "dipegang" oleh variabel lain, _OBJ2 segera tidak valid;
- Dalam "Contoh 3", _OBJ2 yang dibangun oleh TestObject2 () dipegang oleh variabel eksternal OBJ3. Pada saat ini, sampai baris kode "OBJ3 = NULL" berlaku, _OBJ2 tidak akan tidak valid karena hubungan referensi menghilang.
- Untuk alasan yang sama seperti pada Contoh 3, _obj2 dalam "Contoh 4" tidak akan tidak valid setelah baris kode "arr = []".
Namun, "kegagalan" objek tidak menunggu untuk "dirilis". Di dalam runtime JavaScript, tidak ada cara untuk memberi tahu pengguna dengan tepat "kapan objek akan dirilis". Ini tergantung pada mekanisme pemulihan memori JavaScript. - Strategi ini mirip dengan mekanisme daur ulang di .NET.
Dalam kode contoh operasi Excel sebelumnya, pemilik objek, yaitu, "excel.exe", hanya akan terjadi setelah "rilis instance objek ActiveX". Kunci file dan kredensial izin sistem operasi terkait dengan proses tersebut. Jadi jika objek hanya "gagal" dan bukan "rilis", maka proses lain akan memiliki masalah saat memproses file dan merujuk pada kredensial izin sistem operasi.
- Beberapa orang mengatakan ini adalah bug dalam mekanisme JavaScript atau COM. Sebenarnya, tidak. Ini disebabkan oleh hubungan yang kompleks antara OS, IE dan JavaScript, bukan masalah independen.
Microsoft telah mengekspos strategi untuk menyelesaikan masalah ini: secara proaktif memanggil proses daur ulang memori.
Proses CollectGarBage () (biasanya disebut sebagai proses GC) disediakan di (Microsoft) JScript. Proses GC digunakan untuk membersihkan "misalignment objek yang gagal" di IE saat ini, yaitu, proses destruktor menyebut objek.
Dalam contoh di atas, kode yang memanggil prosedur GC adalah:
Salinan kode adalah sebagai berikut:
// ---------------------------------------------------------
// Metode Panggilan Standar Prosedur GC Saat Memproses Objek ActiveX
// ---------------------------------------------------------
function writexls () {
//(agak...)
excel.quit ();
excel = null;
setTimeout (CollectGarBage, 1);
}
Baris kode pertama memanggil metode Excel.Quit () untuk membuat proses Excel dibatalkan dan keluar. Pada saat ini, karena lingkungan JavaScript memiliki instance objek Excel, proses Excel tidak benar -benar dibatalkan.
Baris kode kedua membuat Excel null untuk menghapus referensi objek, sehingga "membatalkan" objek. Namun, karena objek masih dalam konteks fungsi, jika prosedur GC dipanggil secara langsung, objek masih tidak akan dibersihkan.
Baris kedua kode menggunakan setTimeout () untuk memanggil fungsi CollectGarBage, dan interval waktu diatur ke '1', yang hanya membuat proses GC terjadi setelah fungsi writexls () dijalankan. Dengan cara ini, objek Excel memenuhi dua kondisi "dapat dibersihkan oleh GC": tidak ada referensi dan meninggalkan konteks.
Penggunaan prosedur GC sangat efektif di lingkungan JS menggunakan objek ActiveX. Beberapa calon ActiveXObjects termasuk XML, VML, OWC (Office Web Componet), Flash, dan bahkan Vbarray di JS. Dari sudut pandang ini, karena arsitektur AJAX mengadopsi XMLHTTP dan juga perlu memenuhi fitur "No Page Switching", secara aktif memanggil proses GC pada waktu yang tepat akan memberi Anda pengalaman efisiensi yang lebih baik menggunakan UI.
Bahkan, bahkan dengan proses GC, masalah Excel yang disebutkan di atas tidak akan sepenuhnya terpecahkan. Karena IE juga menyimpan kredensial izin. Satu -satunya cara untuk membuat kredensial izin halaman diperbarui adalah "beralih ke halaman baru",
Oleh karena itu, pada kenyataannya, dalam proyek SPS yang disebutkan di atas, metode yang saya gunakan bukan GC, tetapi kode berikut:
Salinan kode adalah sebagai berikut:
// ---------------------------------------------------------
// Kode switching halaman digunakan saat memproses objek ActiveX
// ---------------------------------------------------------
function writexls () {
//(agak...)
excel.quit ();
excel = null;
// Kode berikut digunakan untuk menyelesaikan bug di IE Call Excel, metode yang disediakan di MSDN:
// setTimeout (CollectGarBage, 1);
// Karena keadaan tepercaya dari halaman web tidak dapat dihapus (atau disinkronkan) akan menyebabkan saveas () dan metode lainnya menjadi
// tidak valid lain kali Anda menyebutnya.
location.reload ();
}
Deskripsi operator hapus dalam manual
Referensi menghapus atribut dari suatu objek, atau menghapus elemen dari array.
Hapus ekspresi
Parameter ekspresi adalah ekspresi JScript yang valid, biasanya nama properti atau elemen array.
menjelaskan
Jika hasil ekspresi adalah objek dan atribut yang ditentukan dalam ekspresi ada, dan objek tidak memungkinkannya dihapus, false dikembalikan.
Dalam semua kasus lain, kembalikan benar.
Akhirnya, catatan tambahan tentang GC: Ketika formulir IE diminimalkan, IE akan secara aktif memanggil fungsi collutleGage () sekali. Ini membuat penggunaan memori meningkat secara signifikan setelah jendela IE diminimalkan