자바스크립트에는 GC(가비지 수집 메커니즘)가 있습니다. JavaScript는 가비지 컬렉션 메커니즘을 사용하는 언어입니다. 실행 환경은 코드가 실행될 때 메모리를 관리하고 메모리에서 가비지 개체(참조되지 않는 개체)를 자동으로 삭제합니다.
이 튜토리얼의 운영 환경: Windows 7 시스템, JavaScript 버전 1.8.5, Dell G3 컴퓨터.
가비지 수집과 관련된 개념
① 쓰레기란 무엇입니까
사용되지 않는(참조되는) 객체는 garbage입니다.
② 가비지 컬렉션이란?
참조되지 않은 객체를 파기하고 메모리를 해제하는 것을 가비지 컬렉션이라고 합니다.
C 및 C++와 같은 프로그래밍 언어에는 수동 가비지 수집이 필요합니다.
Java, JavaScript, PHP, Python 및 기타 언어에 대한 자동 가비지 수집.
JS에는 자동 가비지 수집 메커니즘이 있어 이러한 가비지 개체를 메모리에서 자동으로 제거합니다. 우리는 가비지 수집 작업을 수행할 필요도 없고 수행할 수도 없습니다. 우리가 해야 할 일은 더 이상 사용되지 않는 객체를 null로 설정하는 것뿐입니다.
참조 카운팅 방법
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
순환 참조 문제
Netscape Navigator 3.0에서는
function Example(){ let ObjectA = new Object(); let ObjectB = new Object(); ObjectA.p = ObjectB; ObjectB.p = ObjectA; } Example();
ObjectA = null; ObjectB = null;
순환 참조로 인한 메모리 누수 문제를 해결하기 위해 Netscape Navigator 4.0에서는 마크 앤 클리어 방법을 사용하세요
2008년까지 IE, Firefox, Opera, Chrome 및 Safari는 모두 JavaScript 구현에서 마크업 정리(또는 그 변형)를 사용했으며 가비지 수집 실행 빈도만 다릅니다.
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 및 명령문으로 성능을 향상시키세요
V8 엔진 가비지 수집
V8 엔진의 가비지 수집은 표시 및 스위프 방식과 세대별 수집 방식을 채택합니다
신세대와 구세대로 구분됩니다
신세대
신세대 가비지 컬렉션은
Scavenge< /code> 알고리즘을 사용합니다. 配 작은 메모리와 새로 할당된 적은 양의 메모리 <code>Scavenge
算法
分配给常用内存和新分配的小量内存
内存大小
分区
运行
Scavenge
Scavenge
알고리즘🎜新生代 -> 老生代
<자바스크립트에 gc가 있나요? src="https://자바스크립트에 gc가 있나요?.php.cn/upload/article/000/000/024/775b02346fd66880393744dbeb1700d0-0.png" alt="자바스크립트에 gc가 있나요?"/>
老生代
老生代采用
mark-sweep
标记清除和mark-compact
标记整理
通常存放较大的内存块和从新生代分配过来的内存块
1类
2类
3类
1类
,然后进行深度优先遍历。2类
。3类
。标记完成之后,将标记为1类
的对象进行内存释放
<자바스크립트에 gc가 있나요? src="https://자바스크립트에 gc가 있나요?.php.cn/upload/article/000/000/024/d3ba4d940b89fc82bc25f3869f1b3575-1.png" alt="자바스크립트에 gc가 있나요?"/>
Mark-compact
垃圾回收完成之后,内存空间是不连续的。
这样容易造成无法分配较大的内存空间的问题,从而触发垃圾回收。
所以,会有Mark-compact步骤将未被回收的内存块整理为连续地内存空间。
频繁触发垃圾回收会影响引擎的性能,内存空间不足时也会优先触发Mark-compact
<자바스크립트에 gc가 있나요? src="https://자바스크립트에 gc가 있나요?.php.cn/upload/article/000/000/024/d3ba4d940b89fc82bc25f3869f1b3575-2.png" alt="자바스크립트에 gc가 있나요?"/>
垃圾回收优化
全局变量
// 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就可以
<자바스크립트에 gc가 있나요? src="https://자바스크립트에 gc가 있나요?.php.cn/upload/article/000/000/024/0f4033f98face5743238275f0388e49a-3.png" alt="자바스크립트에 gc가 있나요?"/>
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高级教程】
위 내용은 자바스크립트에 gc가 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!