2023년 01월 13일
수정하기
문서 생성 2023-01-13 21:05:27 최근 수정 2023-01-13 23:17:21
📚 오늘 도전하고, 배운 것
오늘의 커밋.
- padosum/achievements 1 commits
- padosum/algorithm 1 commits
JavaScript GC
- Javascript.info에 나온 내용을 정리해본다.
- 자바스크립트에 값들은 메모리 공간을 차지하고 있다. 사용하지 않는 경우에 정리가 필요한데 자바스크립트 엔진이 이를 처리한다. 이를 가비지 컬렉션이라 한다.
- 가비지 컬렉션에는 기준이 있다. 도달 가능한 값인지 여부다.
- 도달 가능한 값의 기준은
- 어떻게든 접근하거나 사용 가능한 값이다. 접근하거나 사용할 수 있기 때문에 메모리에서 삭제하면 안되기 때문이다.
- 도달 가능한 값의 종류 -> 루트라 부른다.
- 현재 함수의 지역변수, 매개변수
- 중첩함수 체인에 있는 함수에서 사용되는 변수/매개변수
- 전역변수
- 루트가 참조하는 값 또는 체이닝으로 루트에서 참조할 수 있는 값은 도달 가능한 값이기 때문에 가비지 컬렉터가 제거하지 않는다.
- 내부 알고리즘은 mark-and-sweep이다.
- 가비지 컬렉터는 루트 정보를 수집해 기억(mark)한다. 루트가 참조하고 있는 모든 객체를 방문해 또 mark. mark된 모든 객체를 방문해서 그 객체들이 참조하는 객체도 mark.
- 도달 가능한 모든 객체를 방문할 때까지 반복한다.
- mark하는 과정에서 DFS 알고리즘이 생각났는데 v8엔진에서 객체를 dfs로 순회한다고 한다.
- 다 mark했다면 mark되지 않은 모든 객체는 삭제된다.
- 아주 좋은 비유가 있었다. 루트에 페인트를 붓는다는 것! 페인트가 묻지 않는 객체는 삭제된다.
- 엔진이 GC를 실제 실행에 영향 끼치지 않기 위해 최적화 기법을 사용한다.
- generational collection: 객체의 대부분은 생성 이후 제 역할을 다하면 쓸모 없어지기 때문에 이들(새로운 객체)을 잘 감지하고, 일정 시간 동안 살아남은 객체(오래된 객체)에 대해선 덜 감시한다.
- incremental collection: 방문해야 할 객체가 많으면 모든 객체를 한 번에 방문/mark 하면 오래걸리기 때문에 여러 부분으로 분리해 별도로 수행
- idle-time collection: CPU가 유휴 상태일 때 수행
🤔 학습하면서 궁금하거나 어려웠던 점
- JavaScript Proxy가 여러 공부 자료에서 나오는데 와닿지가 않았다. 근데 하나 예시를 알게 되었다. observer pattern을 위해 객체 값이 변경된 경우 notify할 수 있다. 기존에는
defineProperty
를 사용해야 하는데 간편해졌다.
🌅 내일은 무엇을?
- Virtual DOM 학습하기
- 코딩 테스트 문제 풀기 (1문제)
✒️ log
- 비가 정말 많이 내렸다.
- 오랜만에 Frontend Developer Load map에 들어가봤다. 사이트가 많이 변했다. 예전에는 그냥 이미지였던 것 같은데
- 모르는 것이 산더미다. 왜 배워야하는지 파악하고 공부하는 것이 중요할 것 같다