Node. js 학습 노트 (5)
6761 단어 node.js
차단 되 지 않 고 이벤트 구동 을 바탕 으로 하 는 Node 서 비 스 는 메모리 소모 가 적은 장점 을 가지 고 대량의 네트워크 요청 을 처리 하기에 매우 적합 하 다.
1. V8 의 쓰레기 수 거 메커니즘 과 메모리 제한
성능 이 민감 한 서버 프로그램 에 대해 메모리 관리의 좋 고 나 쁨, 쓰레기 회수 상황 이 좋 은 지 여 부 는 서비스 에 영향 을 줄 수 있다.Node 에 서 는 이 모든 것 이 Node 의 JavaScript 실행 엔진 V8 과 밀접 한 관 계 를 가진다.
1.1 Node 와 V8
Node 는 크롬의 자 바스 크 립 트 가 실 행 될 때 구 축 된 플랫폼 입 니 다.
V8 의 성능 우 위 는 자 바스 크 립 트 로 고성능 백 엔 드 서비스 프로그램 을 쓸 수 있 게 한다.
Node 는 JavaScript 의 실행 에 있어 V8 에 직접적인 이익 을 얻 을 수 있 습 니 다. V8 의 업그레이드 에 따라 더 좋 은 성능 이나 새로운 언어 특성 을 누 릴 수 있 고 V8 의 일부 제한 도 받 을 수 있 습 니 다. 예 를 들 어 메모리 제한 등 입 니 다.
1.2 V8 메모리 제한
노드 에서 자 바스 크 립 트 를 통 해 메모리 사용 을 하면 일부 메모리 (64 비트 약 1.4GB, 32 비트 약 0.7G) 만 사용 할 수 있 음 을 알 수 있다.
V8 의 메모리 제한 으로 인해 Node 는 큰 메모리 대상 을 직접 조작 할 수 없습니다.
이 문 제 를 일 으 킨 주요 원인 은 Node 가 V8 기반 으로 구축 되 었 기 때문에 Node 에서 사용 하 는 JavaScript 대상 은 기본적으로 V8 자체 의 방식 으로 분배 하고 관리 하 는 것 이다.
1.3 V8 의 대상 배분
V8 에서 모든 자 바스 크 립 트 대상 은 쌓 기 를 통 해 분 배 됩 니 다.
Node 는 V8 의 메모리 사용량 을 보 는 방식 을 제공 합 니 다.
$node > process. memory Usage () {rss: 22044672, heapTotal: 9682944, heapUsed: 5296232, / / 이미 신청 한 메모리 외부: 8860} //사용 한 메모리 더미
코드 에서 변 수 를 설명 하고 값 을 부여 할 때 사용 하 는 대상 의 메모 리 는 더미 에 분 배 됩 니 다.신청 한 남 은 메모리 가 새 대상 을 할당 하지 못 하면 메모리 더 미 를 계속 신청 하여 V8 의 제한 을 초과 할 때 까지 더 미 를 알 수 있 습 니 다.
V8 은 왜 더미 의 크기 를 제한 합 니까?
더 많은 메모리 사용 제한 열기:
node -- max - old - space - size = 1700 test. js / 단 위 는 MB / / 또는 node -- max - new - space - size = 1024 test. js / 단 위 는 KB
1.4 V8 의 쓰레기 회수 메커니즘
V8 에 사용 되 는 각종 쓰레기 수 거 알고리즘:
1.5 쓰레기 수 거 로그 보기
쓰레기 수 거 로 그 를 보 는 방식 은 주로 시작 할 때 - trace 를 추가 합 니 다.gc 매개 변수.쓰레기 수 거 를 진행 할 때 표준 출력 에서 쓰레기 수 거 로그 정 보 를 출력 합 니 다.
쓰레기 회수 로 그 를 분석 함으로써 쓰레기 회수 의 운행 상황 을 파악 하고 쓰레기 회수 의 어떤 단계 가 비교적 오래 걸 리 고 촉발 되 는 원인 이 무엇 인지 찾 을 수 있다.
2. 효율 적 인 메모리 사용
V8 앞에서 개발 자가 갖 춰 야 할 책임 은 어떻게 쓰레기 회수 체 제 를 더욱 효율적으로 일 하 게 하 는 것 입 니까?
2.1 역할 영역
JavaScript 에서 역할 영역 을 형성 할 수 있 는 함수 호출, with 및 전역 역할 영역 입 니 다.
2.2 폐쇄
자 바스 크 립 트 에서 외부 역할 영역 이 내부 역할 영역 에 접근 하 는 변 수 를 실현 하 는 방법 을 클 로 저 (closure) 라 고 합 니 다.이것 은 고급 함수 의 특성 덕분이다. 함 수 는 매개 변수 나 반환 값 으로 할 수 있다.
패 키 지 를 닫 는 것 은 자 바스 크 립 트 의 고급 특성 으로 이 를 이용 하면 많은 교묘 한 효 과 를 낼 수 있다.이 중간 함 수 를 인용 하 는 변수 가 있 으 면 이 중간 함 수 는 방출 되 지 않 고 원시 적 인 역할 영역 도 방출 되 지 않 으 며 역할 영역 에서 발생 하 는 메모리 사용량 도 방출 되 지 않 습 니 다.더 이상 인용 하지 않 는 한 점차 풀 려 날 것 이다.
3. 메모리 지표
3.1 메모리 사용 현황 보기
3.2 외부 메모리
쌓 여 있 는 메모리 사용량 은 항상 프로 세 스 의 상주 메모리 보다 적 습 니 다. 이 는 Node 의 메모리 사용 이 모두 V8 을 통 해 분 배 된 것 이 아니 라 는 것 을 의미 합 니 다.V8 을 통 해 할당 되 지 않 은 메모 리 를 덤 프 메모리 라 고 합 니 다.
더미 밖의 메모 리 는 메모리 제한 을 돌파 할 수 있다.
4. 메모리 유출
Node 는 메모리 유출 에 매우 민감 합 니 다. 온라인 응용 에 수천 수만 의 데이터 가 있 으 면 한 바이트 의 메모리 유출 도 쌓 일 수 있 습 니 다. 쓰레기 회수 과정 은 대상 스 캔 을 하 는 데 더 많은 시간 을 들 이 고 응용 응답 이 느 려 집 니 다. 프로 세 스 메모리 가 넘 치고 응용 이 무 너 질 때 까지.
메모리 유출 원인:
4.1 메모 리 를 캐 시 로 사용 하지 않도록 주의
캐 시 는 응용 에 있어 서 매우 중요 한 역할 을 하여 자원 을 효과적으로 절약 할 수 있다.캐 시 는 I / O 보다 접근 효율 이 높 고 캐 시 에 명중 하면 한 번 의 I / O 시간 을 절약 할 수 있 습 니 다.
한 대상 이 캐 시 로 사용 되면 노대 에 상주 한 다 는 뜻 이다.캐 시 에 저 장 된 키 가 많 을 수록 장기 적 으로 살아 남 는 대상 도 많아 지고 쓰레기 수 거 는 스 캔 과 정 리 를 할 때 이 대상 들 을 헛 되 게 만 들 수 있다.
JavaScript 개발 자 는 일반적으로 대상 의 키 쌍 으로 물건 을 캐 시 하 는 것 을 좋아 하지만, 이것 은 엄격 한 의미 의 캐 시 와 차이 가 있 습 니 다. 엄격 한 의미 의 캐 시 는 완벽 한 만 료 정책 을 가지 고 있 으 며, 일반 대상 의 키 쌍 은 그렇지 않 습 니 다.
무의식 으로 인 한 메모리 유출 장면: memoize
memoize 의 원 리 는 매개 변 수 를 키 로 캐 시 하고 메모리 공간 으로 CPU 실행 시간 을 바 꾸 는 것 입 니 다.
, Redis Memcached。
4.2 대기 열 상태 주목
대부분의 응용 장면 에서 소비 속 도 는 생산 속도 보다 훨씬 크 고 메모리 유출 이 발생 하기 어렵다.하지만 소비 속도 가 생산 속도 보다 낮 으 면 축적 된다.
표층 의 해결 방안 은 소비 속도 가 더 높 은 기술 로 바 꾸 는 것 이다.
깊이 있 는 해결 방안 은 대기 열의 길 이 를 감시 하 는 것 이다.
5. 메모리 유출 검사
1.node-heapunp
2.node-memwatch
6. 메모리 활용
Node 는 큰 파일 을 처리 하기 위해 stream 모듈 을 제공 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Express + AWS S3 이미지 업로드하기웹 사이트 및 모바일 애플리케이션 등에서 원하는 양의 데이터를 저장하고 보호할 수 있다. 데이터에 대한 액세스를 최적화, 구조화 및 구성할 수 있는 관리 기능을 제공한다. AWS S3 에 저장된 객체에 대한 컨테이너...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.