programing

JavaScript 가비지 컬렉션이란?

prostudy 2022. 9. 13. 21:38
반응형

JavaScript 가비지 컬렉션이란?

JavaScript 가비지 컬렉션이란?웹 프로그래머가 JavaScript 가비지 컬렉션에 대해 이해하는 것이 더 나은 코드를 작성하기 위해 무엇이 중요합니까?

Eric Lippert는 얼마 전에 이 주제에 대한 자세한 블로그 투고를 작성했습니다(추가적으로 VBScript와 비교).좀 더 정확히 말하면, 그는 JScript에 대해 썼다.JScript는 JavaScript와 매우 유사하지만 마이크로소프트가 ECMAScript를 직접 구현한 것이다.Internet Explorer의 JavaScript 엔진에서도 대부분의 동작이 동일하다고 가정할 수 있습니다.물론 구현은 브라우저마다 다르지만, 몇 가지 공통 원칙을 취해서 다른 브라우저에 적용할 수 있을 것 같습니다.

이 페이지에서 인용:

JScript는 비연방적 마크 앤 스위프 가비지 컬렉터를 사용합니다.다음과 같이 동작합니다.

  • "범위 내"의 모든 변수를 "Scavenger"라고 합니다.스캐빈저는 숫자, 물체, 끈 등을 가리킬 수 있습니다.우리는 청소기 목록을 관리하고 있습니다. 변수가 범위 내에 들어오면 청소기 목록으로 이동하고 범위를 벗어나면 청소기 목록에서 제외됩니다.

  • 때때로 쓰레기 수집기가 작동한다.먼저 모든 오브젝트, 변수, 문자열 등 GC에 의해 추적되는 모든 메모리에 "마크"가 붙습니다.(JScript는 내부적으로 VARIANT 데이터 구조를 사용하고 그 구조에는 사용되지 않는 비트가 많기 때문에 그 중 하나를 설정합니다.)

  • 둘째, 스캐빈저에 대한 표시와 스캐빈저 참조의 과도적 폐쇄를 지웁니다.따라서 스캐빈저 오브젝트가 비캐빈저 오브젝트를 참조하는 경우 캐빈저 오브젝트 및 그 오브젝트가 참조하는 모든 비트를 클리어합니다(앞의 투고와는 다른 의미로 "closure"라는 단어를 사용하고 있습니다).

  • 이 시점에서 마킹된 모든 메모리에는 범위 내 변수에서 어떤 경로로도 도달할 수 없는 메모리가 할당되어 있음을 알 수 있습니다.모든 물체는 스스로 분해하도록 지시받았고, 그러면 순환 참조가 파괴됩니다.

가비지 수집의 주된 목적은 프로그래머가 작성 및 사용하는 오브젝트의 메모리 관리에 대해 걱정할 필요가 없도록 하는 것입니다.물론 피할 수 없는 경우도 있습니다.가비지 수집의 구조에 대해 적어도 대략적인 것은 항상 도움이 됩니다.

이력 메모: 답변의 이전 개정에서는 다음 항목에 대한 잘못된 참조가 있었습니다.delete교환입니다.JavaScript에서 연산자는 객체에서 속성을 제거하고 완전히 다릅니다.deleteC/C++로 하다

DOM 객체가 관련되어 있는 경우 순환 참조에 주의하십시오.

JavaScript 메모리누전 패턴

개체에 대한 활성 참조가 없는 경우에만 메모리를 회수할 수 있습니다.일부 JS 엔진은 내부 함수에서 실제로 참조되는 변수를 확인하지 않고 주변 함수의 모든 로컬 변수만 유지하므로 폐쇄 및 이벤트 핸들러에서 흔히 볼 수 있는 함정입니다.

다음은 간단한 예입니다.

function init() {
    var bigString = new Array(1000).join('xxx');
    var foo = document.getElementById('foo');
    foo.onclick = function() {
        // this might create a closure over `bigString`,
        // even if `bigString` isn't referenced anywhere!
    };
}

한 JS 에서는 JS를 수집할 수 .bigString★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★하려면 , .bigString = nullinit() )delete 및 인수에는 수 .delete오브젝트에서 오브젝트에 수 "Secret"을 .스택트 모드의 ES5는, 이 오브젝트에는 액세스 할 수 없게 됩니다.ReferenceError컬컬변변))제))))))))))!

메모리 소비를 신경 쓴다면 불필요한 폐쇄는 가급적 피하는 것이 좋습니다.

블로그에서 인용한 좋은 인용문

DOM 컴포넌트는 JScript 컴포넌트와 마찬가지로 "쓰레기 수집"됩니다.즉, 어느 컴포넌트 내에 오브젝트를 생성하여 그 오브젝트를 추적하지 않으면 최종적으로 정리됩니다.

예를 들어 다음과 같습니다.

function makeABigObject() {
var bigArray = new Array(20000);
}

이 함수를 호출하면 JScript 구성 요소는 함수 내에서 액세스할 수 있는 개체(bigArray라는 이름)를 생성합니다.그러나 함수가 돌아오자마자 더 이상 bigArray를 참조할 방법이 없기 때문에 bigArray를 "추적할 수 없게" 됩니다.JScript 구성 요소는 사용자가 정보를 잃어버렸다는 것을 인식하므로 bigArray가 정리되고 메모리가 회수됩니다.DOM ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」라고 document.createElement('div')DOM ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」그 오브젝트를 추적할 수 없게 되면 DOM 컴포넌트가 관련 오브젝트를 삭제합니다.

내가 아는 바로는 JavaScript의 오브젝트는 오브젝트에 대한 참조가 남아 있지 않을 때 정기적으로 수집되는 가비지입니다.이것은 자동적으로 발생하는 것입니다만, 동작의 상세한 것에 대하여는, C++ 레벨로 WebKit 또는 V8소스 코드를 참조해 주세요.

그러나 일반적으로 IE 5.5나 IE 6의 초기 버전, 그리고 아마도 최신 버전과 같은 오래된 브라우저에서는 오프가 되면 메모리가 소모되는 순환 참조를 생성할 필요가 없습니다.특히 폐쇄에 대해서는 JavaScript 참조를 돔 오브젝트에 추가하고 오브젝트를 DOM 오브젝트에 추가하여 JavaScript 오브젝트를 참조했을 때 입니다.기본적으로는 데이터를 수집할 수 없으며, 결과적으로 테스트 어플리케이션에서 OS가 불안정해져 크래시가 발생합니다.실제로는 이러한 누수는 보통 적지만 코드를 깨끗하게 유지하려면 DOM 개체에 대한 JavaScript 참조를 삭제해야 합니다.

일반적으로는 특히 모바일 웹 개발에서 JSON 데이터와 같은 큰 오브젝트를 즉시 참조 해제하기 위해 delete 키워드를 사용하는 것이 좋습니다.이것에 의해, GC의 다음 스위프가 그 오브젝트를 삭제하고, 메모리를 해방합니다.

GC(Garbage Collection)는 더 이상 필요하지 않은 개체를 제거함으로써 자동 메모리 관리의 한 형태입니다.

메모리에 관한 프로세스 거래는, 다음의 순서에 따릅니다.

1 - 필요한 메모리 용량 할당

2 - 약간의 처리를 실시합니다.

3 - 이 메모리 용량 확보

어떤 물체가 더 이상 필요하지 않은지를 감지하기 위해 사용되는 두 가지 알고리즘이 있습니다.

참조 카운트 가비지 컬렉션: 이 알고리즘은 "개체가 더 이상 필요하지 않음"의 정의를 "개체에 참조하는 다른 개체가 없음"으로 줄입니다. 참조 지점이 없으면 개체가 제거됩니다.

마크스위프 알고리즘: 각 개체를 루트 소스에 연결합니다.어떤 객체도 루트 또는 다른 객체에 연결되지 않습니다.이 오브젝트는 삭제됩니다.

현재 대부분의 최신 브라우저는 두 번째 알고리즘을 사용하고 있습니다.

컴퓨터 과학에서 가비지 컬렉션(GC)은 자동 메모리 관리의 한 형태입니다.가비지 콜렉터(또는 단순히 콜렉터)는 애플리케이션에서 다시 액세스하거나 변환되지 않는 객체가 사용한 가비지 또는 메모리를 회수하려고 시도합니다."

모든 JavaScript 엔진에는 자체 가비지 컬렉터가 있으며 서로 다를 수 있습니다.대부분의 경우 당신은 그들을 상대할 필요가 없다. 왜냐하면 그들은 단지 그들이 해야 할 일을 하기 때문이다.

보다 나은 코드 작성은 대부분 프로그래밍 원리, 언어 및 특정 구현에 대해 얼마나 잘 알고 있느냐에 달려 있습니다.

참조 유형은 개체가 할당된 변수에 개체를 직접 저장하지 않으므로 아래 예제의 개체 변수는 실제로 개체 인스턴스를 포함하지 않습니다.대신 오브젝트가 존재하는 메모리 내의 위치에 대한 포인터(또는 참조)를 유지합니다.

var object = new Object();

한 참조 유형 변수를 다른 참조 변수에 할당하면 각 변수가 포인터의 복사본을 가져오고 두 변수 모두 여전히 메모리의 동일한 개체를 참조합니다.

var object1 = new Object();
var object2 = object1;

하나의 개체를 가리키는 두 개의 변수

JavaScript는 가비지 컬렉션 언어이므로 참조 유형을 사용할 때 메모리 할당에 대해 걱정할 필요가 없습니다.그러나 더 이상 필요하지 않은 개체를 참조 해제하여 가비지 컬렉터가 해당 메모리를 비울 수 있도록 하는 것이 좋습니다.이를 위한 가장 좋은 방법은 객체 변수를 null로 설정하는 것입니다.

var object1 = new Object();
// do something
object1 = null; // dereference

참조 개체는 수백만 개의 개체를 사용하는 매우 큰 응용 프로그램에서 특히 중요합니다.

객체 지향 자바스크립트의 원리 - 니콜라스 C. ZAKAS

JavaScript 가비지 컬렉션이란?

이것을 확인하다

웹 프로그래머가 JavaScript 가비지 컬렉션에 대해 이해하는 것이 더 나은 코드를 작성하기 위해 무엇이 중요합니까?

Javascript에서는 메모리 할당과 할당 해제를 신경쓰지 않습니다.모든 문제는 Javascript 통역사에게 요구됩니다.Javascript에서는 아직 누수가 가능하지만, 통역사의 버그입니다.이 토픽에 관심이 있는 경우는, www.memorymanagement.org 를 참조해 주세요.

Windows 에서는, Drip.exe사용해 메모리 누수를 검출하거나, 프리 메모리 루틴이 기능하고 있는지를 확인할 수 있습니다.

매우 간단합니다.웹 사이트 URL만 입력하면 내장 IE 렌더러 메모리 사용량을 볼 수 있습니다.그런 다음 새로 고침을 누릅니다. 메모리가 증가하면 웹 페이지 어딘가에서 메모리 누수가 발견되었습니다.그러나 이것은 IE에서 메모리를 해방하는 루틴이 기능하는지 확인하는 데도 매우 유용합니다.

javascript에서 가비지 컬렉션은 오브젝트가 언제 클리어될지 또는 클리어될지 여부를 결정하지 않습니다.이는 강하게 참조되는 개체에 적용됩니다.강력한 참조 개체는 가비지 컬렉션으로부터 보호됩니다.

ES12 이후 오브젝트가 가비지 수집되었을 때 다음 구현을 수행할 수 있습니다.

javascript에서 가비지 수집에 대한 자세한 내용을 보려면 ES12 이후에 제공되는 Finalizer를 사용하십시오.

let a = new Array(200).fill(true);

파이널레이저를 구축하다

const cleanup = new FinalizationRegistry(key => {
  // your code here
});

cleanup.register(a, 'wewew');

이제 개체 'a'에 연결할 수 없습니다. 가비지 수집 후 최종자 콜백이 발생합니다.

언급URL : https://stackoverflow.com/questions/864516/what-is-javascript-garbage-collection

반응형