ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • #1 Garbage Collection
    기술 면접/Java 2022. 7. 6. 17:33

     

     

    https://www.geeksforgeeks.org/garbage-collection-java/

     

    Garbage Collection이란?

    Garbage Collection은 Java가 자동으로 메모리를 관리를 수행하는 프로세스다. Java 객체들은 heap메모리 영역에서 생성되는데, 나중에 사용하지 않는 객체들을 Garbage Collector가 찾아내고 메모리에서 삭제하여 공간을 확보한다.

     

    C/C++에서는 객체생성과 삭제를 둘 다 진행해야한다. 만약 생성 후 삭제를 진행하지 않으면 메모리 공간 부족으로 새 객체를 사용하지 못하게 되고 프로그램은 중단될 수 있다. OutOfMemoryErrors의 원인.

     

     

    C언어에서의 객체?

    더보기

    C언어는 객체지향 언어가 아님. 근데 객체를 생성한다는 것은 무슨 의미?

     

    Java에서는 객체를 사용할 때 이런 메모리관련 걱정들을 하지 않아도 된다. Gabage Collector가 사용하지 않는 객체들을 삭제해주기 때문. Garbage Collector의 주된 목적은 사용하지 않는 객체들을 삭제하여 heap메모리 영역 확보하는 것.

    Garbage Collector는 background로 항상 작동하는 DaemonThread의 대표 예시

     

    Garbage Collection이 작동하는 원리

    Java의 GarbageCollector는 자동 프로세스. heap 메모리를 지켜보고 있다가 사용하지 않는 객체들을 식별하고 삭제한다. 사용 중이거나 참조하고 있는 객체(in-use / referenced object) 프로그램에서 그 객체의 pointer를 유지하고 있다는 것이다. 반대로 사용하고 있지 않거나 참조하지 않는 객체(unused / unreferenced object)는 더 이상 프로그램이 그 객체에 대한 pointer를 유지하고 있지 않은 것.

    메모리는 참조하고 있지 않은 객체가 사용중이던 메모리를 되돌려 받음.

    The garbage collection implementation lives in the JVM.

    Garbage Collection은 JVM에서 실행된다.

     

     

    Garbage Collection에서 알아야 할 개념

    1. Unreachable objects: 더 이상 참조하고 있지 않아서 접근할 수 없는 객체 island of isolation 도 Unreachable Objects의 한 종류다.

     

    island of isolation이란?

    더보기

    a, b객체가 존재한다고 했을 때 a, b가 서로를 참조하고 다른 객체들을 참조하고 있지 않은 객체

    Demo my_ob_1 = new Demo();
    System.out.println("Demo object one has been created");
    Demo my_ob_2 = new Demo();
    System.out.println("Demo object two has been created");
    my_ob_1.i = my_ob_2;
    my_ob_2.i = my_ob_1;

    https://www.tutorialspoint.com/island-of-isolation-in-java

     

    Integer i = new Integer(4);
    // the new Integer object is reachable  via the reference in 'i'
    i = null;
    // the Integer object is no longer reachable.

    2. Garbage Collection에 적절한(Eligible) 객체로 만들기

    : unreachable object를 GC에 Eligible한 객체라고 말할 수 있다. 위 사진처럼 i = null로 더 이상 4에 접근할 수 없도록 만들면 4에 해당하는 heap 공간은 Garbage Collection에 적절(Suitable)하다.

     

    Garbage Collector에 적절한 객체 만들기

    • 객체를 unreachable를 요구하지 않더라도 unreachable하게 만들어 주는 것을 추천한다.
    • Unreachable하게 만들기 위한 4가지 방법.
      1. 참조 변수 NULL화 하기
      2. 참조 변수 재 할당(re-assign)하기
        StringBuffer s1 = new StringBuffer("hello");
        StringBuffer s2 = new StringBuffer("goodbye");
        System.out.println(s1);
        // At this point the StringBuffer "hello" is not eligible
        s1 = s2;
        // Now the StringBuffer "hello" is eligible for collection
      3. 함수 안에서 객체 생성하기
      4. Island of Isolation

    JVM이 Garbage Collector실행하는 방법

    • Gabage Collection이 되는 객체가 만들어 졌을 때 즉시 공간이 확보되는 것은 아니다. JVM이 Garbage Collector를 실행시킬 때만 공간이 확보 된다. 그러나 언제 JVM이 Garbage Collector를 실행시킬지는 알 수 없다.
    • 하지만 JVM에게 Garbage Collector를 실행시키도록 요청을 보낼 수 있는 방법 두 가지가 있다.:
      1. System.gc() 함수 사용: System 클래스는 JVM에게 Garbage Collector를 요청할 수 있는 gc() static 함수를 제공한다.
      2. Runtime.getRuntime().gc() 함수 사용: Runtime 클래스는 application이 실행중인 JVM과 application 사이에서 상호작용 할 수 있도록 지원한다. 이 클래스의 gc()함수를 사용해 Gabage Collector에 요청을 보낼 수 있다.
      3. 두 호출 방법의 효과는 동일하며, 일반적인 Garbage Collection에서 어느 함수가 Garbage Collector를 실행하는지는 모른다.

     

    Finalization

    Garbage Collector는 finalize()함수를 사용해 객체를 지우고 메모리 공간을 확보한다.

    finalize()함수는 다음처럼 Object class에 속해있다.

    protected void finalize() throws Throwable

    finalize()함수는 Garbage Collector으로부터 호출된다.

     

     

    Garbage Collection의 이점

    1. 참조하고 있지 않은 객체를 힙 메모리에서 지움으로 인해 메모리를 효율적으로 사용할 수 있다.
    2. JVM의 모듈인 Garbage Collector에 의해 자동으로 실행되기 때문에 다른 노력이 필요하지 않는다.

     

     

    결론

     

    GC가 무엇인지

    자동으로 실행되는 background 스레드로 항상 실행되며 heap 메모리를 지켜보고 있다가 더 이상 참조하지 않는 객체를 힙 메모리에서 식별하여 객체를 지우고 메모리 공간을 확보하는 기능이다.

     

    필요한 이유는 무엇인지

    Garbage Collection을 하지 않는다면 객체 생성 후 삭제를 진행하지 않아 프로그램 실행 중 메모리 공간 부족으로 새 객체를 사용하지 못하게 되고 프로그램은 중단될 수 있다. OutOfMemoryErrors의 원인.

    Java에서는 C/C++과 다르게 이를 자동으로 지원해 별 다른 노력을 들이지 않으며 메모리를 효율적으로 사용할 수 있다.

     

    동작방식에 대해 설명해주세요.

    Java의 Garbage Collector는 자동 프로세스. 더 이상 프로그램 안에서 그 객체에 대한 pointer를 유지하고 있지 않으면 사용하고 있지 않은 객체 / 참조하지 않는 객체(unused / unreferenced object)로 식별하여 Garbage Collection을 이행한다.

     

    JVM이 System.gc() / Runtime.getRuntime().gc() 함수로 Garbage Collector 실행하고 Garbage Collector는 finalize()함수로 객체를 메모리에서 지운다.

     

     

     

     

    https://www.geeksforgeeks.org/g-fact-46/

    https://www.baeldung.com/java-stack-heap

    '기술 면접 > Java' 카테고리의 다른 글

    Lambda  (0) 2022.08.18
    Java에서 Null을 안전하게 사용하기  (0) 2022.08.14
Designed by Tistory.