오늘은 자바의 특징중 하나인 GC(Garbage Collection) 즉, 가비지 콜렉션에 대해서 알아볼려한다.
우선 GC가 무엇인가 알아보자.
1. GC란?
JVM에 의해 구동되는 자바 프로그램은 메모리 관리를 개발자가 직접 명시적으로 수행하지 않고 자동 메모리 관리 기능을 지원한다. 가비지 컬렉션은 자바의 메모리 관리 방법 중의 하나로 자바 가상 머신의 Heap 영역에서 동적으로 할당했던 메모리 중 필요 없게 된 메모리 객체를 모아 주기적으로 제거하는 프로세스를 말한다.
2. GC가 등장하게 된 계기
과거의 프로그래밍 언어들은 메모리 할당기능이 존재하지 않거나 프로그래머가 할당한 뒤 수동으로 해제까지 하는 방식으로 메모리를 관리하였다. 대표적인 예가 C와 C++이다. 두 언어에서는 OS 레벨의 메모리에 직접 접근하기 때문에 free()라는 메소드를 호출하여 할당받았던 메모리를 명시적으로 해제해주어야 했다.
그러나 이런 방식의 실수들로 인해 버그의 원인이 되곤 하였다. 게다가 일반적으로 버그는 재현이 가능하고 오류가 있는 부분으로부터 가까운 곳에서 발생해야 파악하기 쉬운데, 메모리 관련 버그는 한참 떨어진 곳에서 발생하고 재현까지 어려운 경우가 허다했다고 한다.
반면 Java에서는 가비지 컬렉터가 메모리 관리를 대행해 주기 때문에 Java 프로세스가 한정된 메모리를 효율적으로 사용할 수 있게 하고, 개발자 입장에서 메모리 관리, 메모리 누수 문제에서 대해 관리하지 않아도 되어 개발에만 집중할 수 있다는 장점이 있다.
3. Garbage 판단 방법은?
가비지 컬렉션은 특정 객체가 가비지인지 아닌지 판단하기 위해서 도달성 즉, 도달능력이라는 개념을 적용한다. 객체에 대해 레퍼런스가 있다면 Reachable로 구분되고, 객체에 유효한 레퍼런스가 없다면 Unreachable로 구분해 버리고 수거해 버린다
- Reachable: 객체가 참조되고 있는 상태
- Unreachable : 객체가 참조되고 있지 않은 상태 (GC의 대상)
자바 가상 머신 메모리에서는 객체들은 실질적으로 Heap영역에만 생성되고 Method Area 영역과 Stack에서는 Heap 영역에 생성된 객체의 주소만을 참조하는 형식으로 구성된다. 하지만 Heap 영역에 객체들이 메서드가 끝나는 등의 특정 이벤트들로 인하여 Heap 영역 객체의 메모리 주소를 가지고 있는 참조 변수가 삭제되는 현상이 발생하면 위 그림에서 Object 3처럼 어디에서도 참조하고 있지 않은 객체(Unreachable)가 발생하게 된다. 이러한 객체들을 주기적으로 가비지 컬렉션이 제거해 주는 것이다.
4. GC 장단점
- GC의 가장 큰 장점은 개발자가 동적으로 할당된 메모리 전체를 관리할 필요가 없어진다.
이로 인해 유효하지 않은 포인터에 접근하거나 이미 한번 해제한 메모리를 두 번 해제하는 등 버그나 불필요한 작업을 해소할 수 있다. - 반면 단점으로는 가비지 컬렉션이 수행되는 정확한 시점을 알 수가 없다. 가비지 컬렉션이 실행될 때는 반드시 애플리케이션을 중지시키는 Stop The World가 수행되고 이는 오버헤드를 일으킨다. 오버헤드는 성능 저하의 원인이 될 수 있다. 그리고 프로그램이 예측 불가능하게 일시 정지 될 수 있기 때문에 실시간 시스템에 적합하지 않다.
출처 : https://jellili.tistory.com/60
[JAVA] 자바 가비지 컬렉션(GC, Garbage Collection) 총정리 - 개념, 배경, 동작원리, 종류
자바 가비지 컬렉션(GC, Garbage Collection) 기본 개념 가비지 컬렉션(GC, Garbage Collection)이란? 자바 가상 머신(JVM)에 의해 구동되는 자바 프로그램은 메모리 관리를 개발자가 직접 명시적으로 수행하지
jellili.tistory.com
출처 : https://spurdev.tistory.com/10
[JAVA] GC(Garbage Collection)이란?
가비지 컬렉션(Garbage Collection)이란? 가비지 컬렉션은 자바의 메모리 관리 기법이다. 힙 메모리에서 동적으로 할당되어 사용 중인 객체와 사용하지 않는 객체를 식별하고 사용하지 않는 개체를
spurdev.tistory.com
'Java' 카테고리의 다른 글
JVM에 대해서.Araboza (feat.JAVA의 동작과정) (0) | 2024.06.21 |
---|---|
JAVA란? (0) | 2024.06.14 |