커뮤니티
WP-자료실
제목:    Garbege Collection
  3381   김윤중

Simple Example

  • Example 1
    • using System;
      class A
      {
         public A() { Console.WriteLine("Creating A"); }
        ~A() { Console.WriteLine("Destroying A"); }
      }
    • class B : A
      {
         public B() { Console.WriteLine("Creating B"); } 
         ~B() { Console.WriteLine("Destroying B"); }
      }
    • class C : B
      {
           public C() { Console.WriteLine("Creating C"); }
            ~C() { Console.WriteLine("Destroying C"); }
      }
    • class App
      {
           public static void Main()
          {
                C c = new C();
                Console.WriteLine("Object Created ");
                Console.WriteLine("Press enter to Destroy it");
               Console.ReadLine();
               c = null;
               Console.Read();
           }
      }
    • result
      }사용자 삽입 이미지
  • Example 2
    • using System;
      class A
      {
          public A() { Console.WriteLine("Creating A"); }
          ~A() { Console.WriteLine("Destroying A"); }
      }
    • class B : A
      {
           public B() { Console.WriteLine("Creating B"); }
           ~B() { Console.WriteLine("Destroying B"); }
      }
    • class C : B
      {
           public C() { Console.WriteLine("Creating C"); }
           ~C() { Console.WriteLine("Destroying C"); }
      }
    • class App
      {
          public static void Main()
         {
               C c = new C();
               Console.WriteLine("Object Created ");
                Console.WriteLine("Press enter to Destroy it");
              Console.ReadLine();
             c = null;
              GC.Collect();
             Console.Read();
         }
      }
    • result
      사용자 삽입 이미지

 

 

  • Unmaged Heap Memory:
    • for C,C++ , Memeorry Alocation, insances
    • cannot be reachable by GC
    • use pointer
  • Managed Heap Memory
    • for .net,
    • reachable by GC,
    • no pointer => the rumtime can do memory magagenemt

Garbage Collector(GC) in .net

  • concept
    • Thread
    • 생성된 객체중에서 접근이 불가능한 객체의 메모리를 수집하여 해제한다.
    • The task of garbage collection is a costly process
    • GC의 실행시기
      • when a call to create a new object fails due to lack of memory
        managed heap memory가 부족할 때(다른 객체의 생성이 불가능 때)
      • when the user explicitly calls GC thread to do garbage collection by calling the function GC.Collect().
    • GC can recollect memory from only those objects which are no longer accessible in your code by any reference
    • if a function goes out of scope,
      • all its local objects will be eligible for garbage collection, unless and until of course the local objects have their references passed outside the function
    • In the case of the windows service,
      • there might be some objects which are no longer required to be referenced but still have references pointing to them.
      • So for them to be eligible to Garbage Collection I have to remove all the references to these objects programmatically
  • 예1
    • void A() {
      B(); //1
      int i = 10; //2
      }
      void B() {
      C c = new C();
      Console.WriteLine(c.Name);
      }
    • 실행이 문장 2에 도달하면 B()에서 생성돤 객체 c늬 접근이 불가하므로 다음 GC가 실행될때 c츼 객체는 해제된다.
  • 예 2
    • class A {
      pribate B b; // line 3
      public void RequiredB() {
      b = new B(); //line 4
      b.DoSomeWork();
      b=null; //line 5
      }
    • 함수 RequiredB가 실행이 완료되어도 line2의 참조 b 때문에 객체 B가 유지된다. RequiredB()의 실행이 종료되면 참조 nuul로 참조 b를 세팅하여 객체 B를 GC가 가능하게 하였다.
  • Multi Reference
    • class A
      {
      private B b;
      //reference now points to nothing, trying to use this directly will give NullPointerException
      private B b2; //another empty reference which points to nothing
      public void RequireB()
      {
      b = new B();
      //Set this reference to an object
      b2 = b; //Also set b2 as reference to the same object pointed by b Now object created above by calling new B() has 2 references b and b2
      b2.DoSomeWork();
      //b2.DoSomeWork is same as b.DoSomeWork() as both point to same object
      b = null;
      //Just doing this will not make the object eligible for garbage collection because even b2 is pointing to it. So you need the line below too! Else there will be a memory leakage
      b2=null;
      }

      }
  • Dispose, IDisposable
    • B b = new B();
      using (b)
      {
      // use b
      } // here compiler will call Dispose on b's IDisposable implementation automatically
    • class K
      {
      K() {}
      void Finalize() //GC가 자동 호출
      {
      base.Finalize();
      }
      }
    • class B : IDisposable
      {
      public void Dispose()
      {
      //Do all cleanup activities
      GC.SuppressFinalize(); //prevent Finalize() being called in GC
      }
      ~B()
      {
      Dispose();
      }
      }