JavaScript: 스 택 넘 침 & 메모리 누 출

4393 단어 JavaScript
자바 스 크 립 트 에 서 는 스 택 넘 침 과 메모리 누 출 이라는 두 가지 개념 을 들 을 수 있 습 니 다. 이 두 가지 메커니즘 은 개발 과정 에서 만 나 는 것 이 많 지 않 지만 만 지면 골 치 아 픕 니 다.이들 의 개념, 촉발 원인, 해결책 을 짚 어 본다.
스 택 넘 침: 스 택 이 넘 치 는 것 은 무엇 입 니까?우 리 는 JS 의 데이터 저장 소 가 스 택 과 더미 로 나 뉘 어 져 있다 는 것 을 알 고 있 습 니 다. 프로그램 코드 가 실 행 될 때 일정한 계산 저장 공간 이 필요 합 니 다. 바로 스 택 입 니 다. 스 택 은 선진 적 인 후 출 원칙 을 따 르 기 때문에 프로그램 은 스 택 밑 에서 계산 을 시작 합 니 다. 프로그램 내부 함수 의 호출 과 반환 은 스 택 에 들 어 가 는 작업 을 계속 수행 하고 스 택 에서 차지 하 는 자원 도 계속 대응 하고 있 습 니 다.그러나 만약 에 당신 의 호출 이 창고 에 들 어 가 는 작업 이 너무 많 으 면 돌아 오 면 창고 가 부족 합 니 다. 이 럴 때 창고 가 꽉 차 서 창고 에 들 어 가 는 사람 이 넘 칠 것 입 니 다.예 를 들 어 여자친 구 와 훠 궈 를 먹 으 러 간 것 같 습 니 다. 원앙 냄비 를 시 켰 습 니 다. 두 사람 은 매 운 것 을 한 사람 이 먹 기 시 작 했 습 니 다. 매 운 것 을 한 사람 이 먹 지 않 고 잘 어 울 렸 습 니 다. 결국 당신 은 식 탐 이 많아 서 매 운 것 을 많이 넣 었 습 니 다. 당신 은 먹 지 못 했 습 니 다. 매 운 기름 이 넘 쳐 서 매 운 것 을 먹 지 않 으 면 여자 친 구 는 기분 이 좋 지 않 습 니 다. 결국 당신 은 욕 을 먹 을 것 입 니 다.당연 하지, JS 창고 가 넘 치면 욕 하지 않 겠 지만, 그 는 잘못 보고 하고 파업 할 거 야.인터넷 에서 비교적 많은 아 날로 그 코드 (재 귀) 를 사용 하 는 예 를 살 펴 보 자.
function isEven(n) {
    if (n === 0) {
        return true;
    }
    if (n === 1) {
        return false;
    }
    return isEven(Math.abs(n) - 2);
}

console. log (factorial (10) 의 답 은 true 입 니 다. 결과 가 빨리 실 행 됩 니 다. console. log (factorial (10000000) 를 입력 하면 오류 가 발생 했 습 니 다. Uncaught Range Error: Maximum call stack size exceeded (이 곡 가 브 라 우 저 테스트 에서 실 행 됩 니 다). 이 오 류 는 최대 호출 이 스 택 크기 를 초과 한 이 유 는 무엇 입 니까?그 이 유 는 프로그램 이 코드 를 실행 하 는 과정 에서 일정한 계산 공간 인 스 택 이 필요 하기 때 문 입 니 다. 보통 크기 는 1M 정도 입 니 다. 프로그램 안의 함수 등 다른 것 을 호출 할 때마다 이런 것들 은 일정한 빈 검 사 를 점용 합 니 다. 너무 많이 사용 하면 이 프로그램 이 배정 한 스 택 의 공간 을 초과 하여 잘못 보고 합 니 다.그렇다면 이 문 제 는 어떻게 해결 할 것 인가?위의 재 귀 예 를 들 어 해결 방법 은 다음 과 같다.
function isEven(n) {
    function isEvenInner(n) {
        if (n === 0) {
            return true;
        }
        if (n === 1) {
            return false;
        }
        return function () {
            return isEvenInner(Math.abs(n) - 2);
        }
    }
    function trampoline(func, arg) {
        var value = func(arg);
        while (typeof value === "function") {
            value = value();
        }
        return value;
    }
    return trampoline.bind(null, isEvenInner)(n);
}
  • 메모리 누 출
  • 메모리 누 출 이란 무엇 입 니까?메모리 누 출 은 프로그램 이 분 배 된 스 택 에 메모리 가 있어 사용 할 수도 회수 할 수도 없다 는 것 을 말한다.바로 너 와 네 여자 친구 가 훠 궈 를 먹 는 것 이다. 중간 에 국 이 없 으 면 요 리 를 데 울 수 없 는 자리 가 있다.메모리 누 출 을 야기 하 는 원인 은 일반적으로 몇 가지 상황 이 있다.
  • 함수 에 성명 변수 키 워드 를 사용 하지 않 은 변수
  • function func() {
        a = 1;
    }
  • 소각 되 지 않 은 타이머
  • setInterval(function () {
        console.log(1)
    }, 1000);
  • DOM 이외 의 노드 참조
  • var elements = {
        button: document.getElementById('button'),
    };
    function doStuff() {
        button.click();
    }
    function removeButton() {
        document.body.removeChild(document.getElementById('button')); //   ,               elements。button         ,     。
    }
  • 폐쇄 적 인 순환 참조
  • function my(name) {
        function sayName() {
            console.log(name)
        }
        return sayName
    }
    var sayHi= my("tom")
    sayHi() //tom

    함수 my () 내부 에 생 성 된 sayName () 함 수 는 회수 메커니즘 에서 회수 되 지 않 습 니 다. 패 킷 이 호출 되 지 않 으 면 패 킷 이 함 수 를 포함 하 는 역할 영역 을 가지 고 있 기 때문에 다른 함수 보다 더 많은 메모 리 를 사용 합 니 다.패 킷 을 지나치게 사용 하면 메모리 사용량 이 너무 많 을 수 있 습 니 다.
    마지막 으로 하나의 개념 을 추가 합 니 다. 우 리 는 앞에서 프로그램 이 실 행 될 때 차지 하 는 메모리 공간 을 언급 했 고 프로그램 이 실 행 될 때 스 택 에 들 어가 서 스 택 을 호출 하고 소각 하 는 것 을 계속 언급 했 습 니 다. 여 기 는 브 라 우 저의 쓰레기 회수 체제 와 관련 됩 니 다.쓰레기 란 무엇 인가?쓰레기 는 더 이상 사용 하지 않 는 변수 입 니 다. 말 그대로 이 변 수 는 쓸모 가 없습니다. 죄송합니다. 브 라 우 저 에 의 해 소각 되 어 공간 을 비 울 것 입 니 다. 브 라 우 저 에서 자주 사용 하 는 쓰레기 회수 방법 은 두 가지 가 있 습 니 다. 태그 제거 와 인용 계수 입 니 다.
    태그 지우 기
    이것 은 가장 상용 하 는 방식 이다.변수 가 실행 에 들 어 갈 때 이전 표 시 를 하면 이 변수 가 코드 의 실행 환경 에 들 어 갔다 는 것 을 증명 합 니 다. 변수 가 실행 되 고 실행 환경 을 떠 날 때 실행 환경 에서 벗 어 났 다 고 표 시 됩 니 다.이 때 쓰레기 수 거 기 는 환경 변수 와 환경 변수 에 의 해 인 용 된 표 시 를 제거 합 니 다.그 다음 에 표 시 된 변 수 는 삭 제 를 준비 하 는 변수 로 간 주 됩 니 다. 환경 변수 가 이 변수 에 접근 할 수 없 기 때 문 입 니 다.마지막.쓰레기 수집 기 는 메모리 제거 작업 을 마치 고 표 시 된 값 을 없 애고 사용 하 는 메모리 공간 을 회수 합 니 다.
    인용 계수
    이런 방식 은 많이 쓰 지 않 는 다.인용 수 는 말 그대로 이 변수 가 인 용 된 횟수 를 계산 하 는 것 이다.하나의 변수 가 설명 되 고 인용 유형 을 부여 하면 이 변수의 인용 횟수 는 상응 하 게 1 을 추가 합 니 다. 이 값 을 포함 하 는 인용 변수 가 다른 값 을 추가 하면 이 값 의 인용 횟수 는 상응 하 게 1 을 줄 이 고 인용 횟수 가 0 으로 변 할 때 이 값 에 접근 할 수 없습니다.쓰레기 수집 기 가 실 행 될 때 인용 횟수 가 0 인 값 이 차지 하 는 메모 리 를 회수 하고 이 메모 리 를 방출 합 니 다.

    좋은 웹페이지 즐겨찾기