Tip And Tech2008.06.24 12:15

*** 가비지 컬렉터 관련 이전내용을 아래 내용으로 업데이트 하였습니다. ***

현재는 디버거와 AIR프로젝트에서만 gc가 실행되고있습니다. 따라서 저를 포함한 많은 분들이 소위 낚였습니다. 자~알 실행되는 줄알고...하지만 일반 플레이어에서는 아무리 gc()를 실행하여도 메모리는 꿈쩍도 하지 않습니다.

많은 고민과 연구를 거듭한 결과 출처불명의 로컬커넥션을 이용한 방법이 있다고 들었고 시행착오와 명용이의 자문을 구해 테스트한 결과 정말 gc()가 실행되더랍니다..

로컬커넥션은 메모리에 통신이 가능한 주소지를 설정하여 이곳을 통해 send객체와 이를 바라보는 connect객체를 통해 서로다른 swf간 통신을 하게하는것입니다.
주소지의 등록은 connect("이름")을 통해 주소지를 등록하는데, 메모리에 같은 주소지를 두번 호출(할당)하게 되면 그때 에러를 발생하면서 시스템의 가비지 컬렉션이 실행하게 됩니다. 따라서 try~catch문을 사용하여 무비가 먹통이 되는것을 방지하여야 합니다.



이 파일을 디버거가 아닌 플레이어 실행결과 System.gc();는 실행되지 않고 LC에 의한 메모리 감소를 확인하였습니다.

var before:String = tmp.currencyFormat( System.totalMemory , {  group:"," , decimal:"." ,
                                                                                          currency:"" , before : false } );

try {
          new LocalConnection().connect('myConnection');
          new LocalConnection().connect('myConnection');
} catch (error:ArgumentError) {
          trace("이미 연결되어있다");
}

var after:String = tmp.currencyFormat( System.totalMemory , {  group:"," , decimal:"." ,  
                                                                                        currency:"" , before : false } );

memory.text = "before :" + before + ",  after :" + after;


테스트 코어부분입니다...테스트를 위해 설정하는 코딩이 너무 많아서 생략하고 실제 LC를 통한 가비지 컬렉터를 실행하는 부분입니다.


* 중요 참고 
gc()에 의해 제거 될수 있는 대상은 사용이 끝난 불필요한 말그대로 쓰레기를 회수합니다. 따라서 제거하고자 하는 대상은 화면에 붙어있다면 지워진 상태이며 이름은 null이고 addEventListener를 통해 바라보고 있는 객체가 있으면 안됩니다...지우거나 null까지는 어떻게 해보겠지만 다른클래스에 있는 리스너까지 손보려면 좀 성가시죠....따라서 addEventListener의 useWeakReference를 활용합니다.

* addEventListener 이외에도 Dictionary클래스에도  WeakReference를 제공합니다. 가비지 컬렉션 시스템에서는 WeakReference(약한 참조)를 무시하므로, WeakReference만 있는 객체는 가비지 컬렉션의 대상이 됩니다.
Posted by 정윤수 버터백통

댓글을 달아 주세요

  1. 메모리 문제에 대해 구현 하신 예제를 보고 싶습니다.
    저도 알고 싶어서요. ㅇ_ㅇ''

    2008.06.20 00:45 [ ADDR : EDIT/ DEL : REPLY ]
  2. GC 넘 골치아파요.... ㅡㅡ;

    2008.06.24 17:35 신고 [ ADDR : EDIT/ DEL : REPLY ]
  3. 칡흙님 LC를 사용한 gc강제 실행부분 업데이트 하였습니다.

    2008.06.24 19:15 신고 [ ADDR : EDIT/ DEL : REPLY ]
  4. 그러게요..gc 호출시 그때 그때 실행해주면 고맙겠는데...그렇지도않으니...
    gc실행시에도 실행에 필요한 메모리가 많이 증가되는지...완벽하지만은 않은
    느낌이 강하게 드네요...

    2008.06.24 23:52 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • 덧글 달아주실때 리플로 달아주시면 감사~ 하겠어요 ㅋ
      덧글 알리미에 안뜨네요 ㅋㅋㅋㅋㅋㅋ

      2008.06.25 09:40 신고 [ ADDR : EDIT/ DEL ]
  5. 좋은 정보 감사합니다. ^^

    2009.02.10 10:51 [ ADDR : EDIT/ DEL : REPLY ]
  6. 메모리 때문에 도는지 알았는데.. 좋은 정보 감사합니다~

    2010.01.23 20:16 [ ADDR : EDIT/ DEL : REPLY ]
  7. 흥미로운데요. 저는 왜 이제봤죠? ^^;;

    2010.01.27 15:39 [ ADDR : EDIT/ DEL : REPLY ]
    • 형님 잘지내시죠?
      스킨 바꾸고 코멘트가 아래에 있어서
      이제야 인사 드립니다~ ^^
      늦엇지만 새해복 많이 받으시고 건강하세요~

      2010.03.04 10:52 신고 [ ADDR : EDIT/ DEL ]
  8. 오호 .. 흥미로운 결과가 나오네요.
    좋은 정보 감사 드립니다 ^^

    2010.03.04 21:26 [ ADDR : EDIT/ DEL : REPLY ]
  9. 또 보니 신기하다는....
    어쨌든 형님소리까지 하시니 몸둘바 모르겠습니다. ^^

    2010.03.09 18:37 신고 [ ADDR : EDIT/ DEL : REPLY ]