2012-07-01 2 views
8

Apple에서 Safari의 Window sand에서 IE, Firefox, Chrome 및 Safari를 테스트 한 모든 브라우저에서이 오류를 발견했습니다.브라우저 새로 고침이 가비지 수집을하지 않음

브라우저 새로 고침, 뒤로 버튼 또는 전달 링크는 브라우저 노드와 javascript 변수 및 객체 등을 덤프해야합니다. WebGL에는 해당되지 않는 것으로 보입니다. 나는 약 100MB에서 200MB의 메모리가 필요한 복잡한 WebGL 응용 프로그램을 개발할 때 먼저 알아 챘다. 개발하는 동안 나는 많은 새로 고침을해야하고 내 컴퓨터는 5 ~ 10 번 새로 고침 후 느려지고 멈추기 시작할 것입니다.

약간의 연구 끝에 나는 이것이 없어야한다는 것을 깨달았습니다. 허용되는 메모리 누수 해결 방법은 이 모든 자바 스크립트 개체와 변수 및 DOM 노드를 해제해야하는 페이지를 새로 고치는 것입니다. 그러나 다음 이미지를 살펴보십시오.

여기 거래가 무엇입니까? 작은 응용 프로그램에서는 눈치 채지 못합니다. 그러나 광산 (orbitingeden.com)과 같은 대형 WebGL 응용 프로그램의 경우 이는 실제 문제이며 내 사용자는 소프트웨어가 실제보다 더 많은 자원을 필요로한다고 생각할 것입니다. 다음 이미지는 내 사용할 수있는 메모리의 모든를 삼키고 다음 새로 고침을 보여줍니다, 그래서 가비지 수집 작업 및/또는 JS와 DOM 객체가 해제되지 않습니다되지 않습니다

http://orbitingeden.com/images/big_memory_after.png

는 누군가가 강제로 트릭을 알고 있나요 브라우저가 진정한 메모리 덤프를 수행 할 수 있습니까? 왜 모든 문서가 잘못 되었나요?

+2

https://bugs.webkit.org/show_bug.cgi?id=76225 – gman

+0

@gman : 질문에 대답하면 신용을 알려 드리겠습니다. 시놉시스 : WebGL은 특정 페이지 (새로 고침)와 관련이없는 도메인 및 탭에 의해 보존되는 컨텍스트를 사용합니다. 결과적으로 WebGL 렌더링에 할당 된 메모리는 사용자가 기본 도메인에서 벗어나 탭을 닫을 때까지 가비지 수집을 위해 해제되지 않습니다. 응용 프로그램에 exit 단추를 추가하면 바로 리디렉션되는 새 도메인으로 빠르게 리디렉션됩니다. –

+0

버그가 지금 당장 고쳐 지므로 조만간 대안이 필요 없을 것입니다. 실제로 webgl 적합성 테스트 (https://cvs.khronos.org/svn/repos/registry/trunk/public/webgl/sdk/tests/conformance/context/context-creation-and-destruction)에 대한 테스트가 있습니다. html) – gman

답변

2

가비지 수집 지점 중 하나는 개체가 이 아니며이 즉시 정리되어 사용되지 않는다는 것입니다. 가비지 컬렉터는 컬렉션을 수행하는 것이 가장 편리 할 때 스스로를 결정할 수 있습니다.

가비지 수집 시스템에서는 정상적으로 사용됩니다. 사용하기에 충분한 메모리가있는 한 힙에 사용하지 않은 개체를 두십시오. 사용하지 않은 메모리가 많아서 컴퓨터가 더 빨리 실행되지 않습니다.

+0

페이지 세션 동안 true로 설정되어 있습니다. 그러나 페이지 새로 고침은 모든 노드를 제거하고 모든 변수를 고아로 만든 다음 최근 버린 개체와 변수를 모아 메모리에서 제거해야하는 가비지 수집을 강제 실행해야합니다. 그럼에도 불구하고, 컴퓨터가 메모리가 부족하기 시작하면 이론에 따라 가비지 수집은 사용되지 않은 모든 객체를 수집하여 처리해야합니다. 하지만 내 컴퓨터는 그 대신에 멈출 것입니다! –

+0

@OrbitingEden : 필요할 때 메모리를 수집하지 않으면 실제 메모리 누출 가능성이 높습니다. 당신이 낮게 달릴 때 가비지 컬렉터가 시작됩니다. – Guffa

+2

그런 다음 질문을 던지면 더 좋을 것 같습니다. 자바 스크립트 메모리 누수가 페이지 새로 고침과 탐색에 어떻게 퍼질 수 있습니까? 그건 불가능합니다, 그렇죠? –

관련 문제