ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 가비지 컬렉션 - 가비지 컬렉션의 개념와 작동 방식
    Java 2024. 4. 13. 17:48

    https://www.ibm.com/topics/garbage-collection-java

    위의 글을 기반으로 작성한다.

    가비지 컬렉션이란?

    자동으로 메모리 할당 및 생성된 객체에 대한 메모리 할당해제를 관리하는 자바언어의 주 기능 중 하나

     

    자바에서의 가비지 컬렉션은 개발자가 메모리 관리 측면에서 걱정없이 코드를 작성하는 것에 집중하도록 도와준다.

     

    그러나 그들의 코드 퍼포먼스와 공통의 메모리 관련 문제들을 피하기 위해서는 자바 개발자라면 가비지 컬렉션의 작동방식은 알아야 한다.

    메모리 부족 에러란?

    메모리 부족 에러는 프로그램 또는 어플리케이션이 이용 가능한 메모리 양 보다 더 많은 양을 할당 하려고 시도할 때 발생하는 에러다.

     

    이러한 에러는 JVM 또는 다른 플랫폼에서 어플리케이션을 작동시키는 동안 메모리가 부족해질 때 발생한다.

     

    JVM에서의 메모리 부족 에러는 전형적으로 어플리케이션 혹은 프로그램이 새로운 객체를 만들때 해당 객체를 위하여 메모리를 할당할 수 없을 때 발생한다.

     

    메모리부족 에러가 일어나면, 어플리케이션은 종종 충돌하거나 종료될 것이다.

     

    이러한 에러를 해소하기 위해서 너는 사용가능한 메모리의 양을 증가시키거나 어플리케이션의 메모리 사용을 최적화 할 필요가 있다.

     

    이것은 JVM 파라미터를 변형함으로서 행해지거나 메모리 누수 및 비효율적인 메모리 사용을 확인하는 툴을 사용함으로서 행해질수 있다.

    자바에서 가비지 컬렉션은 어떤식으로 작동함?

    자바에서 모든 객체는

     

    객체의 동적인 할당을 위해 예약된 메모리의 한 부분인 힙 메모리 영역에 저장된다.

     

    힙에대해서 잠깐 알아보자면

     

    Heap:

    모든 JVM 쓰레드들 사이에서 공유되는 메모리 영역

     

    Heap은 모든 클래스 인스턴스 그리고 배열들을 위해 메모리를 할당하는 런타임 데이터 영역이다.

     

    Heap은 JVM이 켜지면서 생겨진다.

    객체를 위한 Heap 스토리지는 자동적인 스토리지 관리체계(가비지 컬렉터라고 불리는)에 회수된다.

     

    객체들은 절대로 명시적으로 메모리가 해제되지 않는다.

     

    https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.5.3

     

    Chapter 2. The Structure of the Java Virtual Machine

    Conditional branch: ifeq, ifne, iflt, ifle, ifgt, ifge, ifnull, ifnonnull, if_icmpeq, if_icmpne, if_icmplt, if_icmple, if_icmpgt if_icmpge, if_acmpeq, if_acmpne.

    docs.oracle.com

     

    다시 본론으로 넘어와서

     

     

    객체가 더이상 프로그램의 어떠한 부분에서도 참조되지 않는다면,

     

    가비지 컬렉션의 수집대상이 된다.

     

    자바에서 가비지 컬렉터는 사용되지 않는 객체들을 찾기 위해서

    주기적으로 힙 메모리를 스캔한다.

     

    가비지 컬랙션의 프로세스는 Marking, Sweeping, Compacting등의 단계들이 있다.

    • Marking: 
      • 프로그램에서 여전히 참조되고 있는 모든 객체에 대해서 마킹하는 단계
      • 마킹은 전역 변수, 지역변수, 메소드 파라미터와 같은 루트 객체에서 시작하여 도달가능한 모든 객체를 추적한다.
      • 결국 이러한 마킹 행위가 도달하지 못한 객체들은 가비지컬랙션의 수집대상이 된다.
    • Sweeping:
      • 마킹단계 이후, 가비지 컬렉터는 Heap에서 더이상 참조되지 않는 객체의 메모리를 식별하고 회수하기 위해 검색한다.
      • Sweeping 단계에서는 이러한 할당해제된 메모리들을 메모리 풀에 추가하는것을 포함한다
    • Compacting(compact: 압축하다, 빽빽이 채우다)
      • 남아있는 객체에 할당된 메모리들에 대한 분열화를 최소화 하기 위해서 이를 다시 나열한다.
      • 이 행동은 객체들의 간격을 빽빽하게 좁힘으로서, 더 큰 free 메모리를 만드는 것이다.
      • 몇몇 가비지 컬렉션 알고리즘에서 Sweeping 단계는 곧바로 Compaction 단계로 이어진다.

     

    이러한 가비지 컬렉터는 별도의 쓰레드로 작동하고, 전형적으로 백그라운드에서 작동한다.

    그래서 프로그램 실행에 영향을 주지 않는다.

    결론

    가비지 컬렉터션은 개발자가 개발에 집중하고 로직을 형성하는데 있어서

    메모리 관리는 자바에서 별도의 쓰레드로 돌아가는 “가비지 컬렉터”에게 맡기는 것

     

    런타임 환경에서 가비지 컬렉션은 프로그램이 사용하고 있는 힙 메모리 영역을 주기적으로 스캔하여,

    사용중인 객체는 Marking하고,

    마킹 안된 녀석들은 수집 대상이 되어 메모리 풀에 돌려놓고(Sweeping),

    그러면 구멍이 숭숭 생기니까 Compacting을 통해 사용 가능한 메모리 블럭의 크기를 늘리는 행위를 한다.

    'Java' 카테고리의 다른 글

    예외처리와 Try With Resources  (0) 2024.05.30
    함수형 인터페이스  (1) 2024.04.18
Designed by Tistory.