>  기사  >  웹 프론트엔드  >  즉, 메모리 누수 및 자바스크립트 메모리 릴리스 정보

즉, 메모리 누수 및 자바스크립트 메모리 릴리스 정보

黄舟
黄舟원래의
2016-12-14 15:58:28918검색

최근 회사의 비즈니스 시스템을 작업하고 있습니다. 회사에서는 가능한 한 C/S에 가까워야 한다고 요구합니다. 즉, C/S와 마찬가지로 텍스트 상자를 클릭하면 관련 내용이 팝업됩니다. 선택과 입력을 위한 프로젝트입니다.
팝업 창을 사용한 다음 하위 창에서 선택한 항목을 두 번 클릭하고 선택한 값을 상위 폼에 반환했습니다.
시스템이 완성된 후 고객이 사용하는 동안 고객이 512m 메모리 구성을 사용하기 때문에 30-40개의 양식을 열면 IE의 가상 메모리 사용량이 거의 200m에 도달하여 시스템 속도가 느려지고 실행이 중단됩니다. 자바스크립트도 느려집니다.

구글에서 검색해보니 IE의 메모리 누수로 인한 것일 수도 있다는 것을 알게 되었습니다. 자세한 내용은 www.cnblogs.com의 관련 기사를 참조하시기 바랍니다.

작업 관리자를 사용해서 팝업창을 열었는데 IE 메모리가 1~3m 늘어나고 창을 닫아도 메모리가 해제되지 않을 때도 있고, 70분 동안만 해제될 때도 있습니다. 수십 킬로바이트. 문제는 메모리 해제에 있는 것 같습니다.

그러면 메모리 해제라는 생각에 따라 이 문제를 해결할 수 있는 방법을 찾아보고 찾아보세요. 메모리를 해제하는 데 사용되는 비공개 JavaScript 함수 CollectGarbage를 발견했습니다. 모든 팝업 창이 끝나기 전에 자체 정의된 javasctip 변수를 모두 null로 설정하고 CollectGarbage 함수를 호출했습니다.

자바스크립트에서 변수를 null로 설정하면 자바스크립트는 메모리를 해제하지 않습니다. 다음에 해당 변수를 다시 정의하면 해당 변수가 위치한 메모리를 덮어쓰게 됩니다. null로 설정되지 않은 경우 JavaScript는 변수를 다시 정의할 때 새로운 메모리 공간을 엽니다.

위 처리를 사용한 후 창을 다시 열면 IE의 메모리는 매번 1~3m씩 늘어나지만, 창을 닫은 후에는 IE가 500k에서 일정량의 메모리를 해제합니다. 2m까지. 일정한 역할을 했습니다.
페이지에서 타사 컨트롤을 사용하기 때문에 타사 컨트롤의 JavaScript에 있는 메모리가 어떻게 관리되는지는 내가 통제할 수 없습니다.
 


1. 자바스크립트 메모리 해제 방법 예시


모든 상위 함수의 매개변수를 null로 설정하고 CollectGarbage를 사용하여 메모리를 해제합니다.


& lt; script & gt;

// 32M
함수 Alocmem()
{
VAR STR = "12345678" " ;
for(var i=3;i<24;i++)
str+=str
return str
}

함수 A(a)
{
a= null;
return r;
function r()
{
}
}

var f=A(AllocMem()); );
CollectGarbage()
//분명히 출시되었습니다.
r=null;
Alert(2);
CollectGarbage()

.
(각 메뉴 레벨은 ~M 메모리를 할당합니다. 작업 관리자를 봐야만 상황을 볼 수 있습니다.)


참고:
CollectGarbage()는 일반적으로 코어의 메모리를 해제합니다. IE나 NS 프로그램이 종료될 때만 호출됩니다.


참고:
1) 창에 있는 개체의 참조를 다른 창에서 유지하면 창을 닫아도 메모리가 해제되지 않습니다.

그럴 수도 있습니다. window.open()으로 열린 창은 오프너와 프로세스를 공유할 수 있습니다(_blank 또는 _new 창은 그렇지 않을 수 있음). 관리자님, IEXPLORE.EXE가 하나만 실행되는 것을 볼 수 있습니다. 프로세스가 종료될 때만 메모리가 해제될 수 있습니다.

2) 더 나쁜 것은 DOM 개체에 대한 참조를 유지하는 경우 개체가 있는 창을 닫는 것입니다. 찾으면 IE가 충돌하고 메모리 오류를 보고합니다(또는 다시 시작해야 함)

이것은 버그처럼 보입니다. Microsoft에 보고하는 것이 좋습니다

더 많은 관련 기사를 확인하세요. PHP 중국어 넷(www.php.cn)에 주목하세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.