전개발
article thumbnail

소멸자(finalize)를 학습하던 중, 소멸자가 System.gc();를 설명하는 예제에 많이 쓰이는 것을 보고, 가비지 컬렉션(Garbage Collection)에 대해 알아보게 되었습니다.

Garbage Collection(가비지 컬렉션)이란?

자바의 메모리 관리방법 중 하나로, 참조가 더 이상 일어나지 않는 메모리를 해제시켜 공간을 확보하는 방법입니다.
가비지 컬렉션을 수행하는 가비지 컬렉터는 코드를 작성하는 개발자가 메모리 할당과 해제에 일일히 관여하지 않아도 관리가 되게끔 도와줍니다. (C, C++ 에서는 메모리 할당/해제를 직접 관리해줘야 한다고 합니다...)

메모리 공간을 자동으로 확보하면서 메모리 누수를 방지하는 장점이 있지만,
메모리가 해제되는 시점을 알 수 없다는 단점도 존재합니다.

System.gc();

명시적으로 가비지 컬렉션을 발생시키는 메소드입니다.
⛔ 이 메소드는 왠만해서는 사용하지 않는 것을 권장합니다. 해당 메소드 자체가 무거운 작업을 요구하고, 모든 스레드를 중단시켜버리기 때문입니다

가비지(쓰레기) 수거 순서

아래 예제에서는 가비지 수거가 일어나는 순서를 알아보았습니다.

  1. 생성과 소멸 시 name을 출력하는 Test 클래스를 선언했습니다.
  2. Test 클래스의 인스턴스 a,b,c,d를 각각 생성해주었습니다.
  3. a,b,c,d에 null을 할당해주면서, 필요없는 가비지(쓰레기)로 만들어주었습니다.
  4. System.gc(); 메소드로 가비지 컬렉션을 일으켰습니다.
public class GC_test {
    static class Test {
        String name;

        Test(String name) {
            this.name = name;
            System.out.println(name + "생성");
        }

        @Override
        protected void finalize() {
            System.out.println(this.name + "제거");
        }
    }

    public static void main(String[] args)  {
        Test a = new Test("a");
        Test b = new Test("b");
        Test c = new Test("c");
        Test d = new Test("d");

        a = null;
        b = null;
        c = null;
        d = null;

        System.gc();

        // 프로세스 강제종료를 방지
        try{
            Thread.sleep(1000);
        } catch(InterruptedException e){
            e.printStackTrace();
        }
    }
}
  • 첫 번째 실행 결과 (제거 순서 : a-d-b-c)
  • 두 번째 실행 결과 (제거 순서 : a-b-d-c)
  • 세 번째 실행 결과 (제거 순서 : d-a-b-c)

결론적으로, 가비지(쓰레기) 컬렉션은 메모리 할당 순서와 상관없이 랜덤한 순서로 일어나는 것을 확인할 수 있었습니다.

profile

전개발

@전개발

프론트엔드 개발자, 전인혁(Jeonny) 입니다.
포스팅이 좋았다면 "공감❤️" 과 "댓글👍🏻" 부탁드립니다. 😊