2012-01-04 4 views
1

console.log가 활성화 될 때마다 다음 코드를 사용하면 o.big에서 참조하는 문자열이 가비지 수집되지 않습니다. 로깅 문을 제거하자마자 핸들러 함수의 실행이 끝난 후에 큰 문자열에 대한 메모리가 해제됩니다.Firefox console.log로 인해 JavaScript가 가비지 수집을 방해합니까?

Firefox 9.0.1을 사용 중이며 about : memory로 메모리 프로파일 링을 수행했습니다.

$(function() { 
    var handler = function() { 
     var o = {}; 
     o.big = (new Array(20*1024*1024)).join("x"); 
     console.log(o.big); 
     delete o.big; 
    }; 

    $("#btn").click(handler); 
}); 

나는 자바 스크립트 비교적 새로운 오전 CONSOLE.LOG 내에서 사용하는 경우 문자열이 GC에 의해 표시되지 않는 이유 누군가가 나에게 지적 할 수 있다면 그것은 좋은 것입니다.

+0

수동으로 또는 console.clear()를 호출하여 방화 광 콘솔을 지우시겠습니까? 그렇지 않다면 메모리가 손실되는 곳을 생각할 수 있습니다. – jAndy

+0

@jAndy : console.clear()를 추가하거나 수동으로 콘솔을 지우는 것이 효과가있는 것 같지 않습니다. 나는 지금 막 firefox 웹 콘솔을 사용하고있다. 메모리 할당은 여전히 ​​about : memory에 "40.07 MB (33.74 %) - string-chars"로 표시됩니다. 또한 about : memory UI를 통해 수동으로 gc 스위프를 실행하고있었습니다 – mzu

+0

100 % 확신 할 수는 없지만 'console'이'eval'을 사용하여 그것의 작업을 수행한다고 생각합니다. 따라서 변수는 전역 객체에 저장 될 것이므로 결코 GC에 적합하지 않습니다. – jabclab

답변

1

나는 Firebox의/Firebug가 처리하는 console.log()에 익숙하지 않지만 "기록 된"객체를 보여주는 콘솔은이를 검사하고 상호 작용하는 방법을 제공한다고 가정합니다. 적어도 Chrome의 경우입니다.

따라서 콘솔에는 메모리에 보관 될 개체에 대한 참조가 필요하며 콘솔에서 참조를 해제 할 때까지 가비지 수집을 할 수 없습니다 (스크립트를 호스팅하는 페이지가 다시로드 될 때까지 발생하지 않을 수 있음).

마지막으로 delete operator과 가비지 수집간에 명시적인 관계가 없음을 유의하십시오.

+1

이것은 나에게 의미가 있습니다. 만약 console.log가 가비지 콜렉션에 영향을 미칠 수 있다면 (나는 항상 속도에 대해 걱정하고, 로깅에 관해서는 기억하지 않는다.) 이상하게도 광범위하게 논의되지 않는다. – mzu

+0

@mzu 대다수 자바 스크립트 개발자는 여기에 문제가 생길만큼 큰 웹 애플리케이션을 작성하지 않습니다. 일단 페이지가 언로드되면 브라우저는 정상적으로 정리해야합니다. 또한 성능 최적화 노력의 일부는 어색합니다. 프로의 잘못된 쪽 흠. – user123444555621

0

파이어 폭스가 원래 문자열을 계속 참조하는지 여부는 확실하지 않습니다. 나는 console.log()복사본을 유지한다고 주장 할 것입니다. 왜냐하면 문자열은 JS의 일급 멤버이기 때문입니다.

string-chars 메모리 사용량이 about:memory이지만, heap-unclassified가 상승하는 것을 볼 수 있습니다. 이것은 https://bugzilla.mozilla.org/show_bug.cgi?id=563700과 관련이 있거나 FF의 GC가 손상되었다는 의미 일 수 있습니다.

+0

흠, string-chars에 할당 된 메모리는 내 경우 약 40MB 정도로 상당히 일정합니다. 하지만 힙 - 분류되지 않은 초기 이동이 있습니다. 따라서 40MB는 원래 String이 정리되는 동안 콘솔 내에서 사본이 될 수 있습니다. – mzu

관련 문제