2012-03-17 4 views
4

약간 배경이

저는 ExtJS3으로 대규모 JS 응용 프로그램을 개발하고 있습니다. 런타임에 사용자는 수많은 위젯을 열고 닫을 수 있으므로 메모리 사용이 늘어날 수 있습니다. Chrome's heap analyzer을 사용하여 많은 메모리 구멍을 고쳤습니다. 그러나 어떤 경우에는 범인을 찾을 수 없습니다. 힙 분석기는 GCRoot[1234]->store.items과 같은 것을 보여 주며 저장소를 참조 할 코드 섹션을 찾을 수 없습니다.JS 엔진은 가비지 콜렉션 루트를 언제 작성합니까?

질문 V8 (또는 다른 JS 엔진) 새로운 가비지 콜렉터 루트를 만들 것이다 아래에 정확한 런타임 conditons을 무엇

? 그것을 강제로 특정 코드 패턴 (폐쇄, 평가판, 이벤트 listetes ...) 있습니까?

+0

내가 문제는이 크롬 V8 개발자 섹션이며, V8에서 자바 스크립트를 통해 수행 할 수있는 믿을 수 없어하는 데 도움이 그것에. 가비지 콜렉터는 때때로 가비지로 간주되는 모든 객체를 제거합니다. https://developers.google.com/v8/embed#handles –

+0

@Kamyar 참조 정리를 사용하여 코드를 작성하여 가비지 컬렉터를 "돕는"방법은 확실합니다 . 예를 들어,'var temp = ...;/* 사용 온도 * /; temp = null;'이것은'temp'가 연관된 범위를 오염시키지 않도록합니다. 그래서 그 반대가 사실인지 궁금해 : 우리는 의도적으로 JS 사용자 코드에 의해 GC 루트를 만들 수 있습니까? – user123444555621

+0

수정. null 변수를 참조하거나 * delete * 키워드를 사용하여 스택에서 데이터를 제거 할 수 있습니다. GC가 핸들을 사용하지 않고 개체를 수집하기 시작할 때 확신 할 수는 없지만 .Net 또는 Java와는 달리 GC가 고아 수집을 시작할 수 있습니다. 객체에 접근 할 수 없으며 액세스 할 수없는 메모리를 되찾기 위해 크롬 디자이너는 웹 개발자가 GC로 엉망진창을 시작하도록 허용하지 않았다고 생각합니다. 그건 내 두 센트, 그렇게 할 수있는 문서화되지 않은 방법이있을 수 있습니다! –

답변

4

GC 뿌리 개체 가비지 컬렉션 대상 있는 결정하는 시점으로 가비지 컬렉터에 사용되는 오브젝트의 특별한 그룹이다. "루트"는 가비지 수집기가 기본적으로 도달 할 수 있다고 가정하는 개체입니다 ().이 개체는 에 도달 할 수있는 다른 모든 현재 개체를 찾기 위해 추적되는 참조를 추적합니다. 임의의 참조 객체 체인을 통해 접근 할 수없는 객체는 도달 할 수없는 것으로 간주되어 가비지 수집 자에 의해 결국 이 파괴됩니다. V8에 는 루트는 현재의 호출 스택에서 컴파일 캐시에 (즉, 로컬 변수 및 현재 실행 기능 파라미터) 활성 V8 핸들 범위 글로벌 처리하고 개체를 개체 을 구성. http://zetafleet.com/blog/google-chromes-heap-profiler-and-memory-timeline

Q 통해

: 무슨 GC 뿌리를 포함?

A : 많은 것들이 :

  • 내장 된 오브젝트 맵;
  • 기호 표;
  • 개의 VM 스레드 스택;
  • 컴파일 캐시;
  • 핸들 범위;
  • 전역 핸들.

http://code.google.com/chrome/devtools/docs/heap-profiling.html

+0

맞지만 코드에서 어떻게 알 수 있습니까? 예를 들어 컴파일을 제어 할 수 있습니까? VM 스레드는 언제 시작됩니까? – user123444555621

1

을 통해 나는 자바 스크립트 메모리 관리에 전문가는 아니지만, 내가 아는 것과 :

모든 이벤트 핸들러가 정리되고 있는지 확인합니다. 객체/요소에 첨부 된 모든 이벤트 핸들러는 GC가 작업을 수행하는 것을 어렵게 만듭니다.

가능하면 항상 프로토 타입 상속을 사용합니다 (http://www.crockford.com/javascript/private.html). 객체가 각 객체에 대해 하나의 객체를 다시 생성하는 대신 메모리에서 동일한 메소드를 참조 할 수 있으므로 메모리를 절약하고 자바 스크립트 엔진의 성능을 향상시킬 수 있습니다.

사용되지 않은 변수/속성을 모두 널로 지정하십시오. 이 자바 스크립트에서 액세스 할 수 있으며 참조에는 손잡이가없는 경우 객체가 쓰레기 간주됩니다

희망이

관련 문제