JAVA:: JAVA의 설계적 결함 한 가지 - Garbage Collection에 대하여

류영준·2022년 11월 6일
1

JAVA

목록 보기
7/9
post-thumbnail

JAVA의 가비지 컬렉션(Garbage Collection)이 발생하는 동안 오버헤드가 발생한다.

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

프로그램을 개발하다 보면 유효하지 않은 메모리인 가비지(Garbage)가 발생하게 된다. C언어를 사용하는 경우 free()라는 함수를 통해 직접 메모리를 해제해줄 수 있다. 하지만 자바 같은 경우에는 개발을 하다 보면 개발자가 직접 메모리를 해제해주는 일이 없다.

가비지 컬렉션은 자바의 메모리 관리 방법 중의 하나로 JVM(Java Virtual Machine)의 Heap 영역에서 동적으로 할당했던 메모리 영역 중 필요 없게 된 메모리 영역을 주기적으로 삭제하는 프로세스를 말한다. 가비지 컬렉터가 메모리 관리를 자동으로 해주기 때문에 개발자 입장에서는 메모리 관리, 메모리 누수 문제에 대해 완벽하게 관리하지 않아도 되어 개발에만 집중할 수 있다는 장점을 가지고 있다.

User user = new User();
user.setName("ryuyoungjun");
user = null;

// Garbage 발생
user = new User();
user.setName("hello");

“ryuyoungjun”라는 이름을 가지는 user 객체는 더 이상 참조되지 않고 사용이 되지 않아서 Garbage가 되었다. 그래서 JAVA는 이러한 메모리 누수를 방지하기 위해 가비지 컬렉터가 주기적으로 검사하여 메모리를 청소해준다.

가비지 컬렉션의 동작 방식

객체들은 실질적으로 Heap 영역에서 생성되고 Method Area이나 Stack Area 등 Root Area 에서는 Heap Area에 생성된 객체의 주소만 참조하는 형식으로 구성된다. Heap Area는 효율적인 가비지 컬렉션을 위해 Eden, Survival, Old Generation으로 나뉜다. 이 영역들은 서로 다른 메모리 구조로 되어 있기 때문에, 세부적인 동작 방식은 다르다. 하지만 기본적으로 가비지 컬렉션이 실행된다고 하면 다음의 2가지 공통적인 단계를 따르게 된다.

  1. Stop The World
  2. Mark and Sweep

1. Stop The World

Stop The World란 가비지 컬렉터가 더이상 필요 없는 객체를 찾아 지우는 작업을 하기 위해 GC를 실행하는 쓰레드를 제외한 나머지 쓰레드가 멈추는 것을 의미한다. 가비지 컬렉션이 완료되면 작업이 재개된다.

2. Mark and Sweep

  • Mark 과정: 사용되는 메모리와 사용되지 않는 메모리를 식별하는 작업 ****
  • Sweep 과정: ****Mark 과정에서 사용되지 않음으로 식별된 메모리를 해제하는 작업, 즉 참조하고 있지 않은 객체들을 Heap에서 제거하는 작업

Stop The World를 통해 모든 쓰레드가 멈춰서 작업을 중단시키면, 가비지 컬렉터는 스택의 모든 변수 또는 reachable 객체를 스캔하면서 각각이 어떤 객체를 참조하고 있는지 찾아서 마킹한다. 이후에 마킹되지 않은 객체들을 메모리에서 제거하는데, 이러한 과정을 Sweep라고 한다.

가비지 컬렉션의 결함

  1. 가비지 컬렉션이 동작하는 동안에는 다른 동작을 멈추기 때문에 오버헤드가 발생한다.
  2. 할당된 메모리가 해제되는 시점을 정확하게 알 수 없다.

가비지 컬렉션을 위와 같이 Stop And World, Mark and Sweep의 단계를 따르면서 동작을 하게 된다. 참조하고 있지 않은 객체가 필요 없어지는 시점을 개발자가 미리 알고 있는 경우에도 가비지 컬렉션이 메모리 해제 시점을 추적해야 하기 때문에 이 작업은 오버헤드가 발생한다. 이로 인해 가비지 컬렉션이 너무 자주 실행되면 소프트웨어 성능 하락의 문제가 되기도 한다.

마치며

GC는 공부하면 할수록 다양한 기능이 있는거 같다. 자바를 주력 언어로 사용하고 있기 때문에 자바 내부 과정이 어떻게 돌아가는지 깊이 공부할 필요성을 느낀다.

profile
Backend Developer

0개의 댓글