Flex/Flash의 GC에 관하여..
FLEX 2008/06/16 20:36 |
flex나 flash를 다루다 보면 참 알다가도 모를것이 GC입니다..
하지만 전 절대적으로 플래시 플레이어의 GC를 믿는편입니다.
프로젝트를 진행하다 메모리가 FULL이 나는 상황을 만나보지 못했으니 하는 말 일수도 있습니다.
하지만 개발당시 메모리와 CPU를 보며 개발을 하는편입니다.
fps와 System.totalMemory를 찍어서 메모리를 보면서 하는것이 대부분이지만요.
아시는 분들이 꽤 많으실꺼라 생각이 되는데.
System.gc()에 관한 겁니다.
이놈이 debug mode에서만 작동한다는거겠죠..
그런데 온라인 상에서 강제 GC를 일으킬수 있습니다..
try{
new LocalConnection().connect('foo');
new LocalConnection().connect('foo');
}catch(e:Error(){}
플래시 플레이어의 버그로 저렇게 localconnetion을 2번 맺으면 GC가 발생하게 됩니다.
간단하게 Class의 Util로 빼본다면 이렇게 되겠죠..
package net.asjs.utils
{
import flash.net.LocalConnection;
public class GCManager{
public function GCManager() {}
public static function gc():void
{
try
{
new LocalConnection().connect('foo');
new LocalConnection().connect('foo');
}catch (e:Error){
}
}
}
}
하지만 이렇게 해준다고 능사가 아닙니다.
흔히들 addEventListener("type",method);만 적고 끝내는 경우가 많죠..
하지만 리스너가 GC대상이 되려면 이런 코딩을 생활화 해야만 합니다.
addEventListener("type",method,false,0,true); 약한 참조의 활성화..
그리고 지양해야만 하는 코드가 있습니다.
addEventListener("type",function(evt:Event):void{
//로직
});
이렇게 동적 method를 넣어 버리면 저렇게 추가된 이벤트는 참조가 불가능해져서 지울수가 없습니다.
EventManager같은걸 만들어서 관리하는 것도 좋지요..
이외에도 bitmap을 활용하는 것도 좋고 loader를 재활용하는 것도 도움이 됩니다. loader가 불러온 데이터를
재 활용하는 것도 좋은 사용법이 될겁니다.
그리고 중요한 것중에 하나는 이미 받은건 다시 받지 말자입니다.
또한 많이 받아야 하는데 그 많이 받은것이 보여지지 않는 다면 받지 말자입니다.
물론 미리 받아놔야 이벤트가 더 자연스럽고 화려할수는 있습니다만 네크웤을 생각하고 자원을 생각한다면
보여지지 않는 것은 미리 받지 않는것이 커다란 도움을 줍니다. 사이트 로딩속도에도 지대한 영향을 미치죠.
스크립트 몇줄 줄이는 것보다 이미지 하나 덜 부르는것이 10배는 더 효과적 일수 있습니다.
GC이야기 하다 최적화하는 방향으로 이야기가 빠졌네요.
아무튼 아껴야 합니다.그리고 수단 과 방법은 최대한 활용해야 합니다.
그래야 잘 살수 있습니다 :)
참 걱정입니다..
요즘 제 심정은 영어로 하자면... I don't know what i want
무엇을 원하는지 알수가 없네요...제게도 메모리풀 현상이 발생한듯 합니다..
제게도 gc가 필요할때 같습니다..언제 gc가 일어날지 모르겠지만...기다려 보렵니다.
하지만 전 절대적으로 플래시 플레이어의 GC를 믿는편입니다.
프로젝트를 진행하다 메모리가 FULL이 나는 상황을 만나보지 못했으니 하는 말 일수도 있습니다.
하지만 개발당시 메모리와 CPU를 보며 개발을 하는편입니다.
fps와 System.totalMemory를 찍어서 메모리를 보면서 하는것이 대부분이지만요.
아시는 분들이 꽤 많으실꺼라 생각이 되는데.
System.gc()에 관한 겁니다.
이놈이 debug mode에서만 작동한다는거겠죠..
그런데 온라인 상에서 강제 GC를 일으킬수 있습니다..
try{
new LocalConnection().connect('foo');
new LocalConnection().connect('foo');
}catch(e:Error(){}
플래시 플레이어의 버그로 저렇게 localconnetion을 2번 맺으면 GC가 발생하게 됩니다.
간단하게 Class의 Util로 빼본다면 이렇게 되겠죠..
package net.asjs.utils
{
import flash.net.LocalConnection;
public class GCManager{
public function GCManager() {}
public static function gc():void
{
try
{
new LocalConnection().connect('foo');
new LocalConnection().connect('foo');
}catch (e:Error){
}
}
}
}
하지만 이렇게 해준다고 능사가 아닙니다.
흔히들 addEventListener("type",method);만 적고 끝내는 경우가 많죠..
하지만 리스너가 GC대상이 되려면 이런 코딩을 생활화 해야만 합니다.
addEventListener("type",method,false,0,true); 약한 참조의 활성화..
그리고 지양해야만 하는 코드가 있습니다.
addEventListener("type",function(evt:Event):void{
//로직
});
이렇게 동적 method를 넣어 버리면 저렇게 추가된 이벤트는 참조가 불가능해져서 지울수가 없습니다.
EventManager같은걸 만들어서 관리하는 것도 좋지요..
이외에도 bitmap을 활용하는 것도 좋고 loader를 재활용하는 것도 도움이 됩니다. loader가 불러온 데이터를
재 활용하는 것도 좋은 사용법이 될겁니다.
그리고 중요한 것중에 하나는 이미 받은건 다시 받지 말자입니다.
또한 많이 받아야 하는데 그 많이 받은것이 보여지지 않는 다면 받지 말자입니다.
물론 미리 받아놔야 이벤트가 더 자연스럽고 화려할수는 있습니다만 네크웤을 생각하고 자원을 생각한다면
보여지지 않는 것은 미리 받지 않는것이 커다란 도움을 줍니다. 사이트 로딩속도에도 지대한 영향을 미치죠.
스크립트 몇줄 줄이는 것보다 이미지 하나 덜 부르는것이 10배는 더 효과적 일수 있습니다.
GC이야기 하다 최적화하는 방향으로 이야기가 빠졌네요.
아무튼 아껴야 합니다.그리고 수단 과 방법은 최대한 활용해야 합니다.
그래야 잘 살수 있습니다 :)
참 걱정입니다..
요즘 제 심정은 영어로 하자면... I don't know what i want
무엇을 원하는지 알수가 없네요...제게도 메모리풀 현상이 발생한듯 합니다..
제게도 gc가 필요할때 같습니다..언제 gc가 일어날지 모르겠지만...기다려 보렵니다.
'FLEX' 카테고리의 다른 글
| FLEX에서 Label에 StyleSheet 지정하기 (4) | 2008/07/01 |
|---|---|
| Flex에서 NavtiveWindow에 addChld하기... (4) | 2008/06/20 |
| FLEX나 Flash의 Textarea 에서 TextField 접근하기 (4) | 2008/06/19 |
| Flex/Flash의 GC에 관하여.. (5) | 2008/06/16 |
| [Flex]Flex2StyleExplorer (0) | 2008/02/26 |
| AIR/Flex3 정식 Release... (2) | 2008/02/26 |
| [flex3]Flex3 Component Explorer (0) | 2008/02/26 |
| RSLs.. (0) | 2008/02/22 |
이올린에 북마크하기
댓글을 달아 주세요
몇일전에 타이머에서 메모리릭이 발생한다는 글을 읽은 적이 있습니다. 그 포스트롤 보고 Flex3 에 있는 메모리 프로파일러로 테스트해봤습니다.
타이머에게 이벤트리스너를 설정할때 addEventListener("type",method); 이렇게 강한 참조로 해도, 약한 참조로 일부러 설정해도 프로파일러에서는 일정시간이 지난후 GC 가 되더군요..
디버그용 파일이라서 그런가... ㅡㅡa
약한 참조가 힘을 발휘할때는 element가 root로부터 끊어을 때 상황에서 힘을 발휘하게 될겁니다.
element는 remove되었고 null되었는데 eventListener는 remove하지 않았다면 이럴 경우 GC가 안될수 있는 부분도 GC가 됩니다. 근데 GC가 된다고 하는데도 완전 100%된다라고 확신지어 말할수 밖어 없는 기분.. 캬..
그래도 FP의 GC는 믿을만 한거 같아요..그냥 믿기로 했습니다. AVM을 뜯어 볼수도 없으니..음..
속을 못보니 그냥 하라는데로 해야겠네요
localconnection을 호출하는 방법을 사용할 경우 이후 버젼에서는 적용되지 않을 수 있고 합니다.
되도록 사용하지 말라고 하던데요.
ㅇ_ㅇ.... 머... 이후 버젼에서는 관리하는 함수가 별도로 나오겠져머....
그러게요..이건 거의 편법이죠
다음 버전에는 gc도 들어 가지 않을까 생각해 봅니다..
3d까지 지원해주려면 gc도 확실히 해주겠죠
좋은 하루 되세요!