Rumah > Artikel > hujung hadapan web > Adakah javascript mempunyai gc?
Terdapat GC (mekanisme kutipan sampah) dalam javascript. JavaScript ialah bahasa yang menggunakan mekanisme pengumpulan sampah Persekitaran pelaksanaan bertanggungjawab untuk mengurus memori apabila kod dilaksanakan, dan secara automatik memusnahkan objek sampah (objek yang tidak dirujuk) daripada memori.
Persekitaran pengendalian tutorial ini: sistem Windows 7, versi JavaScript 1.8.5, komputer Dell G3.
Konsep berkaitan kutipan sampah
① Apa ialah sampah
Objek yang tidak digunakan (dirujuk) ialah sampah.
② Apakah pengumpulan sampah?
Objek yang tidak dirujuk dimusnahkan dan memori dilepaskan, iaitu pengumpulan sampah.
Bahasa pengaturcaraan seperti C dan C memerlukan pengumpulan sampah secara manual.
Pengumpulan sampah automatik untuk Java, JavaScript, PHP, Python dan bahasa lain.
JS mempunyai mekanisme pengumpulan sampah automatik, yang secara automatik akan memusnahkan objek sampah ini dari ingatan Kami tidak memerlukan dan tidak boleh melakukan operasi pengumpulan sampah. Apa yang perlu kita lakukan ialah menetapkan objek yang tidak lagi digunakan untuk null.
Kaedah pengiraan rujukan
Idea
let arr = [1, 0, 1] // [1, 0, 1]这块内存被arr引用 引用次数为1 arr = [0, 1, 0] // [1, 0, 1]的内存引用次数为0被释放 // [0, 1, 0]的内存被arr引用 引用次数为1 const tmp = arr // [0, 1, 0]的内存被tmp引用 引用次数为2
Masalah rujukan bulat
Netscape Navigator 3.0 mengguna pakai
function Example(){ let ObjectA = new Object(); let ObjectB = new Object(); ObjectA.p = ObjectB; ObjectB.p = ObjectA; } Example();
ObjectA = null; ObjectB = null;
Untuk menyelesaikan masalah kebocoran memori yang disebabkan oleh rujukan bulat, Netscape Navigator 4.0 mula menggunakan kaedah tanda dan jelas
Dalam 2008, IE, Firefox, Opera, Chrome dan Safari semuanya menggunakan mark-sweep (atau variannya) dalam pelaksanaan JavaScript mereka, hanya berbeza dalam kekerapan mereka menjalankan pengumpulan sampah.
Idea
function Example(n){ const a = 1, b = 2, c = 3; return n * a * b * c; } // 标记Example进入执行上下文 const n = 1; // 标记n进入执行上下文 Example(n); // 标记a,b,c进入执行上下文 console.log(n); // 标记a, b, c离开执行上下文,等待垃圾回收
const dan biarkan pengisytiharan meningkatkan prestasi
Kutipan sampah enjin V8
Kutipan sampah enjin V8 menggunakan kaedah mark-and-sweep dan kaedah pengumpulan generasi
Terbahagi kepada generasi baru dan generasi lama
Generasi baru
Saiz memoriSistem 32-bit 16M memori
Scavenge
Sistem 64-bit 32M memori
Algoritma
新生代 -> 老生代
老生代
老生代采用
mark-sweep
标记清除和mark-compact
标记整理
通常存放较大的内存块和从新生代分配过来的内存块
1类
2类
3类
1类
,然后进行深度优先遍历。2类
。3类
。标记完成之后,将标记为1类
的对象进行内存释放
Mark-compact
垃圾回收完成之后,内存空间是不连续的。
这样容易造成无法分配较大的内存空间的问题,从而触发垃圾回收。
所以,会有Mark-compact步骤将未被回收的内存块整理为连续地内存空间。
频繁触发垃圾回收会影响引擎的性能,内存空间不足时也会优先触发Mark-compact
垃圾回收优化
全局变量
// exm1 function Example(){ exm = 'LeBron' } // exm2 function Example(){ this.exm = 'LeBron' } Example()
未清除的定时器
const timer = setInterval(() => { //... }, 1000) // clearInterval(timer)
闭包
function debounce(fn, time) { let timeout = null; return function () { if (timeout) { clearTimeout(timeout); } timeout = setTimeout(() => { fn.apply(this, arguments); }, time); }; } const fn = debounce(handler, 1000); // fn引用了timeout
未清除的DOM元素引用
const element = { // 此处引用了DOM元素 button:document.getElementById('LeBron'), select:document.getElementById('select') } document.body.removeChild(document.getElementById('LeBron'))
这个其实不难,浏览器原带的开发者工具Performance就可以
1、尽量不在for循环中定义函数
// exm const fn = (idx) => { return idx * 2; } function Example(){ for(let i=0;i<1000;i++){ //const fn = (idx) => { // return idx * 2; // } const res = fn(i); } }
2、尽量不在for循环中定义对象
function Example() { const obj = {}; let res = ""; for (let i = 0; i < 1000; i++) { // const obj = { // a: i, // b: i * 2, // c: i * 3, // }; obj.a = i; obj.b = i * 2; obj.c = i * 3; res += JSON.stringify(obj); } return res }
3、清空数组
arr = [0, 1, 2] arr.length = 0; // 清空了数组,数组类型不变 // arr = [] // 重新申请了一块空数组对象内存
【推荐学习:javascript高级教程】
Atas ialah kandungan terperinci Adakah javascript mempunyai gc?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!