SSISO Community

시소당

자바 스레드의 Garbage Collection,..

자바에서  Garbage  Collection은  더  이상  참조되지  않는  메모리를  모아  시스템에  되돌려  주는  것이라고  할  수  있습니다.  자바에서  객체,  배열은  모두  heap  이라는  메모리  공간에  저장되며  new  키워드를  이용하여  객체를  생성할  때  마다  heap의  메모리에  객체가  할당  됩니다.  물론  C++과는  달리  자바에서는  사용한  메모리를  반환하는  방법은  없으며  내부적으로  Garbage  Collector  이러한  일을  하고  있습니다.

Garbage  Collector는  낮은  우선  순위를  가지는  Background  Process로  동작하면서  어떤  객체의  메모리를  반환해야  하는  것인지를  계속  검사하며  만약  반환  대상이  되는  사용되지  않는  객체를  찾았다면  소멸자를  수행  하는  것과  같이  필요한  몇  가지  일을  하고  객체를  해제하여  이  객체의  매모리를  heap  에  반환하게  됩니다.

자바에서  프로그래머가  코드에서  메모리를  반환하기  위해  보통  대상  객체에  null을  대입하고  System.gc()  메소드를  호출하는  방법을  주로  이용  하지만  System.gc()를  호출  했다고  가비지  컬렉션이  된다는  보장은  없으며  JVM이  한가하다면  Garbage  Collection  일어나면서  객체들은  소멸되고  메모리는  반환  됩니다.

객체의  경우엔  참조를  잃어  버린다면  Garbage  Collection되지만  쓰레드의  경우엔  객체에  대한  참조를  잃어  버리더라도  Garbage  Collection  되지  않습니다.  즉  run  메소드의  실행이  종료  되었을  때  Garbage  Collection  되죠^^

만약  쓰레드가  종료되더라도  Thread  객체에  대한  참조를  유지하고  있더라도  재사용은  불가능  합니다.  즉  Thread  객체는  종료되고  개체에  대한  참조를  잃어  버린  시점에  Garbage  Collection  되는  자격이  생기며  실질적으로  Garbage  Collection  되는  시점은  JVM에  의존하게  됩니다.


-  Thread의  재사용

Thread  객체는  어떠한  경우라도  재사용  불가능  하며  Runnable  Class를  이용하여  Thread를  만들었다면  재사용이  가능하며  Thread  객체를  다시  생성하는  것보다  Runnable  객체를  이용하여  재사용하는  것이  효율적이며  쓰레드  풀링과  같이  응용하는  경우에  유리  합니다.

Thread  객체는  Runnable  객체를  포함하고  있고  이미  생성된  Thread  객체의  Runnable  객체의  참조를  얻을  수  없으므로  Runnable  객체를  참고하기  위해서는  Thread  객체를  생성하기  전에  Runnable을  사용자가  생성하고  그  생성된  객체를  이용하여  Thread  객체를  생성해야  합니다.

public  class  ThreadTest  {

        public  static  void  main(String[]  args)  throws  Exception  {
                        
                        Thread  thread1  =  new  MyThread();
                        thread1.start();
                        thread1.join();    //thread가  종료될때까지  main이  기다린다.
                        
                        //아래  부분의  주석을  풀면  오류남...
                        //Thread를  상속받아  구현한  쓰레드는  재사용  불가
                        //thread1.start();
                        //thread1.join();                      
                        
                        
                Runnable  r  =  new  MyRunnable();

                Thread  rThread  =  new  Thread(r);

                rThread.start();
                rThread.join();
                
                //재사용
                rThread  =  new  Thread(r);
                
                                
                                //재사용
                                Thread  rThread2  =  new  Thread(r);
                                rThread2.start();
                                rThread2.join();
        }
}
        
/**
*  Thread를  상속받은  Thread
*  재사용  불가,  run  메소드가  종료되면  Garbage  Collection  되므로  사용자가  변경  불가능
*
*/
class  MyThread  extends  Thread  {
        public  void  run()  {
                System.out.println("MyThread......");
        }
}

/**
*  Runnable을  구현한  Thread
*  이  경우엔  run  메소드가  종료되면  Thread  클래스는  Garbage  Collection  되지만
*  MyRunnable  클래스는  Garbage  Collection  되지  않음
*/
class  MyRunnable  implements  Runnable  {
        public  void  run()  {
                System.out.println("MyRunnable......");
        }
}

673 view

4.0 stars