javascript 칼럼에서는 가비지 수집 메커니즘, 메모리 누수 및 클로저 내용을 모두에게 소개합니다.
Written at the front: 이것은 주로 프레임워크가 만연한 시대에 javascript 칼럼에 쓰기 시작하는 시리즈입니다. 업무용, 인터뷰용, 기술 발전용으로 프레임워크를 사용하지만, JS의 기본 지식은 금상첨화이며 꼭 배워야 할 지식이기도 합니다. 자동차를 운전하는 사람은 자동차에 대해 많이 알 필요는 없지만 자동차의 일반적인 기능만 익히면 됩니다. . 하지만 자동차를 안다면 운전을 더 잘할 수 있습니다. 물론, 기사는 단지 하나의 지식 포인트에 대해서만 이야기하는 것이 아닙니다. 일반적으로 관련된 지식 포인트가 시리즈로 연결되어 자신의 학습을 기록하면서 자신의 학습을 공유하고 서로 격려하게 됩니다! 가능하시다면 좋아요도 부탁드려요, 여러분의 좋아요 덕분에 저도 업데이트하는데 더 힘이 됩니다!
개요
식사 시간: 6~12분
난이도: 쉬움, 뛰지 말고 다 읽을 때까지 기다리세요
쓰레기 수집 메커니즘
이전 블로그에서는 주로 메모리(스택 메모리 및 힙 메모리, 딥 카피 및 얕은 카피)는 물론 사용 후에는 사용하지 않은 메모리를 반환해야 합니다. 마치 휴대폰에서 사용하지 않는 소프트웨어를 백그라운드에서 삭제하는 것과 마찬가지로 실행 속도를 향상시킬 수 있습니다. 그렇지 않으면 더 많이 사용할수록 조만간 정체될 것입니다. JS도 마찬가지입니다. JS 也是一样的。
function changeName(){ var obj1={}; var obj2={};
obj1.target=obj2;
obj2.target=obj1;
obj1.age=15; console.log(obj1.target); console.log(obj2.target);
}
changeName();复制代码
在函数执行完毕的时候, obj1 和 obj2 还是活的好好地,因为 obj1.target 和 obj2.target가끔 JS의 Garbage Collector는 공원을 순찰하는 경비원처럼 변수를 "순찰"하여 관련 없는 사람들을 빠르게 떠나게 합니다. 변수가 더 이상 필요하지 않으면 변수가 차지하는 메모리 공간을 해제합니다. 이 프로세스를 garbage collection
JS의 가비지 수집 알고리즘은 두 가지 유형으로 나누어집니다. 및 마크 지우기
참조 카운팅 참조 카운팅은 가장 기본적인 가비지 수집 알고리즘이며 최신 브라우저에서 제거되었습니다. 참조 카운팅 방법을 배우기 전에 먼저 reference라는 개념을 알아야 합니다. 현재 변수가 가리키는 메모리 주소에 대한 설명이라고 생각하면 됩니다. JS 참조 데이터 유형 먼저 코드 줄을 살펴보겠습니다.
function changeName(){ var obj1={}; var obj2={};
obj1.target=obj2;
obj2.target=obj1;
obj1.age=15; console.log(obj1.target); console.log(obj2.target);
}
changeName();复制代码
obj에 값을 할당하면 실제로 참조 개수가 1인 변수를 가리키는 reference
가 생성됩니다. ,
참조 카운트 메커니즘에 따라 메모리의 각 값은 참조 카운트에 해당합니다
그리고 obj를 null에 할당하면 이 변수는 쓸모없는 메모리 조각, 그러면 이때 obj의 참조 횟수는 0이 되고 가비지 컬렉터에 의해 재활용됩니다. 즉, obj가 차지하는 메모리 공간입니다. 가 출시됩니다
함수 범위의 수명주기는 매우 짧습니다. 함수가 실행된 후 내부 변수는 기본적으로 쓸모없는 변수입니다. 이를 지우지 않으면 메모리 쓰레기가 됩니다. 해제되지 않고 여전히 사용 중입니다. 원래 메모리를 버리지 않으면
메모리 누수
가 발생하기 쉽습니다. 먼저 코드 일부와 실행 결과를 살펴보겠습니다.
function f1(){ var n=999;
nAdd=function(){n+=1} function f2(){ console.log(n);
} return f2;
} var result=f1(); //等同于return f2();
result(); // 999
nAdd();
result(); // 1000
nAdd();
result(); // 1000复制代码
obj1.target과 obj2.target이 서로를 참조하는 것을 볼 수 있습니다. obj1.age일 때 >가 변경되면 obj1.target.age와 obj2.target.age도 동시에 영향을 받습니다. 실행 시 obj1 및 obj2는 여전히 살아 있습니다. obj1.target 및 obj2.target의 참조 카운트 때문입니다. > 실행 후에도 여전히 1
, 분명히 함수가 실행되었지만 이런 쓰레기가 여전히 존재합니다. 이러한 함수가 너무 많으면 🎜메모리 누수🎜가 불가피합니다🎜🎜🎜🎜마크 및 지우기 방법🎜🎜 위의 참조 카운팅 방법의 단점은 이미 명백합니다. 그러면 지금 우리가 말하는 마크 앤 클리어 방법에는 그러한 문제가 없습니다. 판단 기준은 객체 🎜가 도달 가능 🎜인지 확인하는 것이므로 주로 🎜 표시 단계 🎜와 🎜 삭제 단계 🎜의 두 단계로 나뉩니다. 🎜🎜🎜🎜 표시 단계 🎜🎜 가비지 수집기는 다음에서 시작됩니다. 루트 객체(Window 객체) 및 도달 가능한 모든 객체를 검색하는 것이 소위 🎜reachable🎜🎜🎜🎜🎜제거 단계입니다.
스캔하는 동안 루트 개체가 건드릴 수 없는 개체(🎜unreachable🎜)는 불필요한 개체로 간주되어 가비지로 삭제됩니다🎜
现在再来看下上面的代码
function changeName(){ var obj1={}; var obj2={};
obj1.target=obj2;
obj2.target=obj1;
obj1.age=15; console.log(obj1.target); console.log(obj2.target);
}
changeName();复制代码
DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는