[JS] 4-2. 가비지 컬렉션

heyhey·2023년 2월 22일
0

JavaScript

목록 보기
8/14

가비지 컬렉션

JS는 메모리 관리를 하고있다.
우리가 만드는 모든 것들은 메모리를 차지한다. 이렇게 쌓이면 메모리를 많이 차지할텐데 쓸모없는 것들은 어떻게 처리할까?

가비지 컬렉션 기준

JS는 도달 가능성이라는 개념을 사용해 관리를 수행한다.
어떻게든 접근하거나 사용할 수 있는 값을 의미한다.
도달 가능한 값은 메모리에서 삭제되지 않는다.

  1. 도달 가능한 값 (root)
  • 현재 함수의 지역변수
  • 중첩 함수의 체인에 있는 함수에서 사용되는 변수
  • 전역 변수
  1. 루트가 참조하는 값이나 체이닝으로 루트에서 참조할수 있는 값은 도달 가능한 값이다.

가비지 컬렉션 알고리즘

mark-and-sweep 이라고 불리는 가비지 컬렉션 알고리즘을 알아보자

순서

  • 가비지 컬렉터는 루트 정보를 기억하고 기억한다(mark)

  • 루트가 참조하고 있는 모든 객체를 방문하고 기억한다.

  • mark된 모든 객체에 방문하고, 그 객체들이 참조하는 객체도 기억한다.

  • 루트에서 도달 가능한 모든 객체를 방문한다.

  • mark되지 않은 모든 객체를 메모리에서 삭제한다.

최적화 기법

  • 세대별 수집 : 객체를 새로운 객체와 오래된 객체로 나눈다. 객체 상당수는 생성 후에 쓸모가 없어지는데, 이러한 객체를 새로운 객체로 구분한다. 일정시간 이상 살아남은 객체는 오래된 객체로 분류한다.

  • 점진적 수집 : 모든 객체를 한번에 방문하고 기억하는데는 오래 걸리기 때문에 여러 부분으로 나누어 별도로 수행한다.

  • 유휴시간 수집 : 실행에 영향을 주지 않기 위해 CPU가 유휴상태일때만 실행한다.

메서드


객체의 프로퍼티에 함수를 할당해 객체가 행동할 수 있게 한다.
메서드는 객체에 저장된 정보에 접근할 수 있어야 한다.
메서드 내부에서 객체에 접근하는 법은 ?

this


this는 메서드를 호출할 때 사용되는 객체를 나타낸다.

할당할때 user.name 으로 안하고 this.name 을 사용하는 이유가 무엇이죠?
외부 변수를 사용해 객체를 참조하면,

let user = {
  name: "John",
  age: 30,

sayHi() {
alert( user.name );
}

};

```js
let admin = user;
user = null; 
admin.sayHi();  // Error: Cannot read property 'name' of null

sayHi의 name은 user의 name을 참조하는데 현재 그 값이 없기 때문에 에러가 나게 된다.

this 는 나중에 한번더 공부를 하는걸로 하겠다.

profile
주경야독

0개의 댓글