티스토리 뷰
공부합시다! 웹 프론트 엔드 개발자분들 화이팅!
자바스크립트는 실행 환경에서 코드 실행 중에 메모리를 관리해서 가비지 콜렉션 언어라고도 불릴 수 있다.
자동으로 필요한 메모리를 할당하고 사용하지 않는 메모리는 회수한다 하지만 특정 시점에서 메모리를 회수하도록 할 수 있다.
예로 함수의 지역 변수 같은 경우는 함수가 종료되면 지역 변수를 할당 하던 메모리가 회수되는데 이렇게 명확하지 않은 경우도 많다.
1. 브라우저의 가비지 컬렉션 알고리즘
1-1. 표시하고 지우기 (mark-and-sweep)
(대략) 메모리에 저장된 변수 전체에 표시를 남기고 컨텍스트에 있는 변수와 그 변수가 참조하는 변수에서 표시를 지운다.
이 후에 표시가 남아있는 변수가 담긴 메모리는 회수한다.
1-2. 참조 카운팅 (reference counting) - 거의 안쓰지만 인터넷 익스플로러에서는 네이티브 자바스크립트가 아닌 객체에 접근해야하기 때문에 쓰인다.
(대략) 변수를 선언하고 참조 값이 할당되면 참조 카운트를 증가 시킨다. 다른 변수가 같은 값을 참조하면 카운트가 증가한다. 해당 값을 참조하는 변수에 다른 값을 할당하면 원래 값의 참조 카운트는 줄어든다.
참조 카운트가 0이 되면 해당값에 접근할 방법이 없으며 가비지 컬렉터 실행시 메모리를 회수한다.
* 하지만 참조 카운팅의 경우 순환참조라는 문제가 발생한다.
각 객체가 서로를 참조하고 있을 경우는 해당 컨텍스트가 종료되도 참조 카운트가 0이 되지 못하고 이 코드가 여러번 실행되면 낭비되는 메모리가 늘어나게 된다. 이럴경우 각 변수에 null 을 할당하면서 가비지 컬렉터에서 메모리를 회수하게끔 할 수 있다.
과거 ie 는 가비지 컬렉터는 자주 사용해서 성능이슈가 있었던 만큼 가비지 컬렉터는 변수의 수가 많은 만큼 상당한 비용이 든다. 그러므로 전역 변수나 전역 객체의 프로퍼티와 순환 참조에 대한 참조는 수동으로 참조를 제거하는것이 좋은데 보통 null 을 할당해서 다음 가비지 컬렉터 실행 때 회수하도록 한다.
'웹 > 자바스크립트' 카테고리의 다른 글
컨텍스트, 스코프 (context, scope) (0) | 2020.02.23 |
---|---|
배열의 값을 오름차순으로 바꾸기 (sort) (0) | 2017.04.18 |
문자열 뒤집기 (split, reverse, join) (0) | 2017.04.18 |