2016-12-08 4 views
0

나는 C/C++로 프로그래밍을 배웠다. 그래서 자바 스크립트의 메모리 관리는 나에게 결코 직관적이지 않다.자바에서의 메모리 관리

모든 변수가 스택 메모리가 아닌 힙 메모리에 있다는 것을 알고 있으므로 메모리 조작이 상당히 비쌉니다. 변수에 대한 모든 참조가 더 이상 액세스 할 수없는 경우 가비지 수집 될 수 있지만 V8에서 즉시 가비지 수집을 수행하지 않는 것처럼 보입니까? (--trace_gc으로 관찰 됨)

전역 배열 객체의 메모리를 해제하려면 array = null으로 수행 할 수 있으며 array = []은 같은 효과가 있습니까? (변수를 지운 후에도 배열처럼 동작해야합니다.)

제 경험상 StringNumber은 값으로 함수에 전달되는 반면 ObjectArray은 참조로 함수에 전달됩니다. String이 매우 크고이 함수가 실제로 참조로 전달 될 수 있도록 허용하는 경우 (문자열 만 읽음) V8에서 이와 같이 최적화됩니까?

ES6는 블록 범위 선언 let 키워드를 소개하지만, let의 단일 사용은 전체 기능이 느려지하게, 그래서 난 아직도 익숙 C/C++에 가까운 varlet/const 불구하고 충실. (d8 master 브랜치에서 빌드 된 것을 사용하여 테스트했는데, V8 개발자가이 버그에 대해 적극적으로 노력하고 있음을 알고 있습니다.)

Chrome DevTools를 사용하여 내 코드의 메모리 관리를 배우려고했지만 프로파일 러의 그래프 및 차트가 실제로 의미하는 바를 파악할 수 없었습니다.

+1

스팸 태그하지 마세요. 귀하의 질문은 C++과 아무런 관련이 없습니다. 심지어 호환성으로 사용하는 경우에도 – StoryTeller

+1

JS에서 메모리에 대해 그렇게 많이 걱정할 필요는 없습니다. 브라우저에서 처리하도록하십시오. – Cerbrus

+0

내가 조기에 최적화하려고 시도하고 있다는 소리를 들려줍니다. 이 경우에 해당하는지 확인하려면 [이 간단한 차트를 참조하십시오] (https://xkcd.com/1691/)를 참조하십시오. – vlaz

답변

1

기본적으로 메모리와 엄청난 기술적 인 것들을 직접 관리하고 싶을 때 C++을 사용합니다.

메모리를 관리하는 가상 시스템이 있기 때문에 C#/Java를 원하지 않는다면.

JavaScript가 브라우저에서 메모리를 관리한다는 점을 유의하십시오. 수천 개의 요소가있는 페이지를로드하거나 수천 개의 데이터를 표시/계산할 라이브러리를 작성하지 않으면 메모리에 문제가 없습니다.

array = null이 기존 배열을 역 참조 할 때 array = []은 새로운 빈 배열의 참조에 영향을 미칩니다. null이기 때문에 사용하려고 시도하면 작동하지 않으므로 array=[]으로 이동하십시오.

여전히 확신이 없다면, 적절한 라이브러리를 사용하여 작업하십시오.