이 기사는 프론트 엔드 개발자에게 도움이되기를 희망하는 JavaScript 및 IE 브라우저의 메모리 관리 및 릴리스 타이밍 및 방법을 자세히 설명합니다.
메모리 릴리스 인스턴스
코드 사본은 다음과 같습니다.
<script language = "javaScript">
<!-
strtest = "1";
for (var i = 0; i <25; i ++)
{
strtest += strtest;
}
경고 (strtest);
strtest 삭제;
CollectGarbage ();
//->
</스크립트>
Collect Garbage는 메모리를 해제하는 데 사용되는 IE의 고유 한 속성입니다. 사용 방법은 다음과 같습니다. 변수 또는 참조 객체를 NULL 또는 DELETE로 설정 한 다음 릴리스 작업을 수행하십시오.
CollectGarbage를 수행하기 전에 필요한 두 가지 조건이 명확해야합니다.
참조 - 객체가 사는 상황 밖에서 유효하지 않습니다.
- 글로벌 객체가 실행되지 않으면 유효하지 않습니다 (참조).
코드 사본은 다음과 같습니다.
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// JavaScript 객체가 언제 실패합니까?
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
함수 testObject () {
var _obj1 = new Object ();
}
함수 testObject2 () {
var _obj2 = new Object ();
반환 _obj2;
}
// 예 1
testObject ();
// 예제 2
testobject2 ()
// 예제 3
var obj3 = testobject2 ();
obj3 = null;
// 예제 4
var obj4 = testobject2 ();
var arr = [obj4];
obj3 = null;
arr = [];
이 네 가지 예에서 :
- "예제 1"은 함수 testObject ()에서 _OBJ1을 구성하지만 함수가 종료되면 함수의 컨텍스트를 남기므로 _OBJ1은 유효하지 않습니다.
- "예제 2"에서 객체 _obj2는 testObject2 ()에도 구성되어 전달되므로 객체에는 컨텍스트 환경 (및 수명)이 "함수 외부"가 있지만 함수의 리턴 값은 다른 변수에 의해 "유지"되지 않기 때문에 즉시 무적입니다.
- "예 3"에서, testobject2 ()에 의해 구성된 _obj2는 외부 변수 OBJ3에 의해 유지됩니다. 현재 코드 "OBJ3 = NULL"라인이 발효 될 때까지 _OBJ2는 참조 관계가 사라지기 때문에 유효하지 않습니다.
- 예 3에서와 같은 이유로, "example 4"의 _obj2는 코드 "arr = []"라는 행에 유효하지 않습니다.
그러나 객체의 "실패"는 "릴리스"를 기다리지 않습니다. JavaScript 런타임 내부에는 사용자에게 "객체가 언제 출시 될 것인지"를 정확하게 알리는 방법이 없습니다. 이것은 JavaScript의 메모리 복구 메커니즘에 따라 다릅니다. -이 전략은 .NET의 재활용 메커니즘과 유사합니다.
이전 Excel 작동 예제 코드에서 객체의 소유자, 즉 "Excel.exe"는 "ActiveX Object Instance 릴리스"후에 만 발생합니다. 파일 잠금 및 운영 체제의 권한 자격 증명은 프로세스와 관련이 있습니다. 따라서 객체가 "릴리스"가 아닌 "실패"인 경우 파일을 처리하고 운영 체제의 권한 자격 증명을 참조 할 때 다른 프로세스가 문제가됩니다.
- 어떤 사람들은 이것이 JavaScript 또는 COM 메커니즘의 버그라고 말합니다. 사실, 그렇지 않습니다. 이는 독립적 인 문제가 아닌 OS, IE와 JavaScript 간의 복잡한 관계에 의해 발생합니다.
Microsoft는이 문제를 해결하기위한 전략을 노출 시켰습니다. 메모리 재활용 프로세스를 적극적으로 호출하십시오.
CollectGarbage () 프로세스 (일반적으로 GC 프로세스라고 함)는 (Microsoft) JScript에 제공됩니다. GC 프로세스는 현재 IE, 즉 객체를 호출하는 소멸의 프로세스에서 "실패한 객체 오정렬"을 정리하는 데 사용됩니다.
위의 예에서 GC 절차를 호출하는 코드는 다음과 같습니다.
코드 사본은 다음과 같습니다.
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// ActiveX 객체를 처리 할 때 GC 절차의 표준 호출 방법
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
함수 writexls () {
//(약간...)
Excel.quit ();
Excel = null;
settimeout (CollectGarbage, 1);
}
첫 번째 코드 줄은 Excel.quit () 메소드를 호출하여 Excel 프로세스가 중단되고 종료되도록합니다. 현재 JavaScript 환경에는 Excel 객체 인스턴스가 있기 때문에 Excel 프로세스는 실제로 중단되지 않습니다.
두 번째 코드 줄은 Excel이 객체 참조를 지우기 위해 NULL을 만들어 객체를 "무효화"합니다. 그러나 객체가 여전히 함수 컨텍스트에 있으므로 GC 프로 시저가 직접 호출되면 객체는 여전히 정리되지 않습니다.
코드의 세 번째 줄은 settimeout ()을 사용하여 CollectGarbage 함수를 호출하고 시간 간격이 '1'으로 설정되어 writexls () 함수가 실행 된 후에 만 GC 프로세스 만 발생합니다. 이런 식으로 Excel 물체는 "GC에 의해 정리 될 수 있습니다"의 두 가지 조건을 충족합니다. 참조가없고 컨텍스트를 떠나십시오.
GC 절차의 사용은 ActiveX 객체를 사용하는 JS 환경에서 매우 효과적입니다. 일부 잠재적 인 활성 Xobject에는 XML, VML, OWC (Office Web Componet), Flash 및 vbarray가 포함됩니다. 이 관점에서 Ajax 아키텍처는 XMLHTTP를 채택하고 "No Page Switching"기능을 충족해야하므로 적절한 시간에 GC 프로세스를 적극적으로 호출하면 UI를 사용하여 더 나은 효율성 경험을 제공합니다.
실제로, GC 프로세스에도 불구하고, 위에서 언급 한 Excel 문제는 완전히 해결되지 않습니다. 즉, 권한 자격 증명을 캐시하기 때문입니다. 페이지의 권한 자격 증명을 업데이트하는 유일한 방법은 "새 페이지로 전환"하는 것입니다.
따라서 실제로 위에서 언급 한 SPS 프로젝트에서 내가 사용한 방법은 GC가 아니라 다음 코드였습니다.
코드 사본은 다음과 같습니다.
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// Page Switching Code는 ActiveX 객체를 처리 할 때 사용됩니다
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
함수 writexls () {
//(약간...)
Excel.quit ();
Excel = null;
// 다음 코드는 MSDN에 제공된 메소드 인 IE Call Excel의 버그를 해결하는 데 사용됩니다.
// settimeout (CollectGarbage, 1);
// 웹 페이지의 신뢰할 수있는 상태를 지울 수 없거나 동기화 할 수 없으므로 Saveas () 및 기타 메소드가
// 다음에 전화 할 때 유효하지 않습니다.
location.reload ();
}
매뉴얼의 삭제 연산자에 대한 설명
참조는 객체에서 속성을 제거하거나 배열에서 요소를 삭제합니다.
표현식을 삭제하십시오
표현식 매개 변수는 유효한 jscript 표현식, 일반적으로 속성 이름 또는 배열 요소입니다.
설명
표현식 결과가 객체이고 표현식에 지정된 속성이 존재하고 객체가 삭제되지 않으면 거짓이 반환됩니다.
다른 모든 경우에, True를 반환하십시오.
마지막으로, GC에 대한 보충 메모 : IE 양식이 최소화되면 IE는 CollectGarBage () 함수를 적극적으로 한 번 호출합니다. 이로 인해 IE 창이 최소화 된 후 메모리 사용이 크게 향상됩니다.