7장. 크롬 개발자 도구를 활용한 애플리케이션 분석
네트워크 탭
- 불필요한 요청 또는 중복되는 요청이 없는지
- 웹페이지 구성에 필요한 리소스 크기가 너무 크지 않은지
- 리소스를 불러오는 속도는 적절한지 또는 너무 속도가 오래 걸리는 리소스는 없는지
- 리소스가 올바른 우선순위로 다운로드되어 페이지를 자연스럽게 만들어가는지
메모리 탭
- 애플리케이션에서 발생하는 메모리 누수, 속도 저하, 혹은 웹페이지 프리징 현상을 확인할 수 있는 유용한 도구
힙 스냅샷
- 해당 시점의 메모리 내용만 촬영하는 프로파일링 기법
- 현재 시점의 메모리 상황을 알고 싶을 때
# 얕은 크기와 유지된 크기
- 얕은 크기 : 객체 자체가 보유하는 메모리 바이트의 크기
- 유지된 크기 : 해당 객체 자체뿐만 아니라 다른 부모가 존재하지 않는 모든 자식 객체들의 크기까지 더한 값
var counter = 0 var instances = [] func Y() { this.j = 5 } func X() { this.i = counter++ this.y = new Y() } export default func App() { func handleClick() { instances.push(new X()) } return <button onClick={handleClick}>+</button> }
스냅샷을 통해 X는 유지된 크기가 100, 얕은 크기가 52로 선언됨 ( Y를 제외하고 X라는 객체 자체의 크기는 52 / Y 객체의 크기는 48)
⇒ 메모리 누수를 찾을 때는 얕은 크기(객체 자체의 크기)는 작으나 유지된 크기(객체가 참조하고 있는 모든 객체들의 크기)가 큰 객체를 찾아야 함.
⇒ 해당 객체가 복잡한 참조 관계를 가지고 있다는 뜻. 이러한 객체가 오랜 시간 동안 메모리에 남아있다면 그로 인해 많은 메모리를 점유하고 있을 수 있음
- useMemo나 useCallback과 같은 의존성이 있는 값들이 정말로 렌더링 사이에 그대로 유지되는지 육안으로 직접 확인 가능 (스냅샷 사이에 해당 훅으로 감싼 값들이 재생성되지 않았기 때문)
타임라인 할당 계측
- 시간의 흐름에 따라 메모리의 변화를 살펴보고 싶을 때
- 메모리 변화를 일으킨 변수가 무엇인지, 그리고 해당 변수가 어느 정도 크기를 차지하고 있는지 등을 확인
- 특정 변수를 클릭 해 전역 변수로 저장을 누르면 해당 변수가 무슨 값을 가지고 있는 객체인지 확인 가능
할당 샘플링
- 메모리 공간을 차지하고 있는 자바스크립트 함수를 보고 싶을 때
- 할당 계측과의 유사점 : 시간의 흐름에 따라 발생하는 메모리 점유를 확인할 수 있다
- 할당 계측과의 차이점 : 자바스크립트 실행 스택별로 분석할 수 있고, 이 분석을 함수 단위로 한다
- 프로파일링할 때 브라우저에 주는 부담을 최소화할 수 있어 장시간에 걸쳐 디버깅을 수행해야 할 때 유리
⇒ 즉, 아래와 같은 경우엔 할당 샘플링을 활용하는 것이 좋다
- 메모리 누수가 짐작되지만 정확히 어디에서 발생하는지 확인하기 어려워 힙 스냅샷을 촬용해 비교하기 어려운 경우,
- 오랜 기간 메모리 누수가 의심되어 프로파일링을 장기간 수행해야 하는 경우
Next.js 환경 디버깅하기
디버그 모드 실행
"dev" : NODE_OPTIONS= ’ --inspect ’ next dev
Next.js 서버에 트래픽 유입시키기
- 사용자가 서서히 유입되면서 메모리 누수가 발생하는 경우가 많음
- 따라서 서버에 직접 트래픽을 발생시켜서 확인하는 편이 제일 확실한 방법
- 아래 코드를 터미널에서 실행시켜, 사용자의 트래픽이 서버로 몰리는 상황을 시뮬레이션해 볼 수 있음
>> ab -k -c 50 -n 10000 "http://127.0.0.1:3000/"
// http://127.0.0.1:3000/을 향해 한 번에 50개의 요청을 총 10,000회 시도한다
// ab : 단순히 요청을 수행하는 것뿐만 아니라 요청으로부터 응답받는 데 걸린 시간, 바이트 크기 등 다양한 정보 확인 가능