BLOG main image
분류 전체보기 (68)
excel.101 (0)
rewind (9)
(3)
(2)
목공 (3)
(3)
me2day (0)
The Ethereal Void (9)
코드 (14)
귀찮은것 (0)
Visitors up to today!
Today hit, Yesterday hit
daisy rss
tistory 티스토리 가입하기!
'memory leak'에 해당되는 글 2건
2007. 3. 22. 01:53
자야되는데 잠은 오질 않고 새벽 두시가 다 되어간다. 개인적으로 매력인 언어로만 생각하고 있었지, 그 속의 무수한 내용들을 아직 인지가 부족하다. Ajax 책은 많이 나왔지만, 그 역시도 조금 더 나은 스크립팅 팁의 수준에서 머물고 있다.

정말 이렇게 대중적이면서 평가절하되고 몰이해되는 언어가 또 있을까 생각을 해보았다. 일전에 VBscript 대신 Jscript로 Server Page를 작성하면서, Server-Side 언어로써 JavaScript가 얼마나 매력적이면서 불완전한지를 경험한 적이 있었다. 그러면서도 계속 빠져드는건..? 알수가 없다.

Garbage Collector에 대한 내용을 정리중이다. 일단 가장 흔히 인지되고 있는 IE 메모리 누수현상중 순환참조에 대한 부분을 생각해 볼려고 한다.

먼저 순환 참조에 대한 일반적인 이해에는 Garbage Collector에 대한 간단한 작동 방식을 이해해야 된다.

다음 코드를 보자.
var Vervain = new Herb();
var Verbena = Vervain;
Vervena 가 객체 Vervain을 참조하게 되면 scope 내에 Vervain에 대한 참조카운트가 1이 증가한다. 그리고 실행이 끝나고, scope 를 벗어날 때 해당 scope 내에 Verbena는 파괴되게 된다. 그렇게 되면 Vervain 객체에 대한 참조카운트는 다시 1이 감소한다. 그렇게 되면 GC에서는 Vervain의 참조카운트가 0이 되었으므로 더 이상 사용하지 않는 객체로 판단하고 메모리를 해제하게 된다.

하지만 다음과 같은 경우는 어떨까?

var Vervain = new Herb();
var Verbena = new Herb();
Vervain.see = Verbena;
Verbena.see = Vervain;
Vervain과 Verbena는 서로를 참조하고 있다. 이러한 경우를 순환참조라고 한다. 객체에 대한 참조를 따라가 보면 완전한 연결고리를 형성하게 된다.

하지만 위와 같은 경우는 어떻게 메모리를 해제해야 될까? Vervain과 Verbena의 참조카운트는 모두 1이다. Vervain 를 해제하기 위해서는 Vervain에 대한 참조카운트가 0이 되어야 하는데, 이는 Verbena.see 가 Vervain을 참조하고 있다. 역으로 Verbena에 대한 참조카운트도 0이 되어야 하나 Vervain.see 는 Verbena를 참조하고 있다. 결국 이러한 순환참조는 메모리 누수현상을 가져오게 된다. (IE 7에선 이러한 문제가 해결되었다.) 이러한 메모리 누수현상을 방지하기 위해서는 위와 같은 순환 참조를 형성하지 않거나, Vervain.see = null 혹은 Verbena.see = null 을 할당함으로써 참조카운트를 0으로 만들어 GC에서 메모리를 해제하게끔 만들어야 한다.




반응형
2007. 3. 21. 14:01
FireFox 에는 onpropertychange event가 없다.
IE에서 DOM element의 값 변경사항 등을 감시하는데, 다음과 같이 쓰인다.

IE 기준:
var ROFL = function() {
	if (event.propertyName == "value") {
		alert("I got ya!");
	}
}

var inputElement = document.getElementById("input"); 
inputElement.onpropertychange = ROFL;
inputElement.value = "snooping..";


하지만, FF에는 onpropertychange 이벤트가 없다. 한참 고민을 하던 중에 예전에 Netscape에는 변수의 변화를 감시할 수 있는, watch, unwatch 가 있었다. 이 놈들이 DOM element 에도 적용이 되는지 테스트해보았다.

var header = document.getElementById("header");
header.watch("id", function(id, xn, xp) {
    alert(id + "," + xn + "," + xp);
});
header.id = ":)";
header.unwatch("id");

header.style.watch("width", ....);
header.style.width = "100px";
header.style.unwatch("width");

된다. :)
그러나, 확인되야 될 사항이 있다.

  1. closures 사용에 따른 메모리 유출.
  2. 감시되고 있는 객체가 삭제될 경우.
  3. unwatch 를 사용하지 않을 경우 메모리 유출.


반응형
prev"" #1 next