본문 바로가기

프로그래밍 언어/java

[java] 가비지 컬렉션(Garbage Collection, GC)의 개념

728x90
반응형

 

 

이번 시간에는 Java에서 컴파일을 하면 생기게 되는 자바 바이트코드를 실행할 수 있도록 해주는 JVM의 기능중 하나인

가비지 컬렉션(Garbage Collection), 줄어서 GC에 대해서 알아보도록 하겠습니다.

 

 

 

java를 개발했던 경험을 잘 생각해보면 객체를 여러번 생성한 기억은 있어도, 이걸 해제한 기억이 없습니다.

C와 같은 경우에는 메모리 할당을 해주면 그 메모리가 해제되기 전까지는 계속 메모리 영역에 남아있어 누수가 생기게 되는데, java는 어떨까요?

 

 

결론적으로 java는 이러한 메모리 누수를 관리해주는 기능을 갖고 있습니다.

이는 가비지 컬렉션이라고 불리며 시스템에서 더 이상 사용하지 않는 동적 할당된 메모리 블럭인 가비지를 추적하여,

자동으로 할당된 부분을 해제시켜주는 역할을 합니다.

따라서 개발자는 메모리 누수를 신경쓰지 않고도 프로그램을 구현할 수 있는 것입니다.

 

 

 

 

가비지 컬렉터의 원리

 

 

가비지 컬렉터는 다음과 같은 일을 통하여 메모리 관리를 가능하게 해줍니다.

1. 메모리를 할당한다

2. 사용 중인 메모리를 인식한다

3. 사용하지 않는 메모리를 인식한다

 

 

사용하지 않는 메모리의 경우는 아래와 같이 예를 들 수 있습니다.

Student stu = new Student();
...

stu = null;
stu = new Student();

 

 

위와 같은 경우에서 생성자를 호출하여 객체를 생성한 후에, 아래에서 더 이상 해당 부분을 참조하지 않고 새로운 객체를 생성하여 참조합니다.

이런 경우에는 기존에 생성한 객체에 대한 메모리 영역에 대해서 누수가 생기고 있다는 것을 알 수 있습니다.

 

 

 

이러한 가비지 컬렉터는 Minor GC와 Major GC에 따라서 불필요하다고 판단되는 메모리를 해제합니다.

Minor GC와 Major GC에 대한 이해를 위해서는 우선 JVM의 메모리 구조를 이해해야 합니다.

 

 

출처 : https://inspirit941.tistory.com/294

 

위는 JVM의 메모리 구조로, GC를 이해하기 위해서 눈여겨보아야 할 부분은 Young generation과 Old generation입니다.

 

 

기본적으로 JVM의 Heap은 객체는 대부분 일회성이고, 오래동안 메모리에 남아있지 않는다는 전제를 가지고 설계되었기 때문에 

만들어진지 얼마 되지 않은 객체는 Young에, 그 중에서 Reachable(참조 가능한) 상태를 유지한 객체가 Old에 남아있게 됩니다.

 

 

 

먼저 Young 영역에서 일어나는 Minor GC 의 방식은 아래와 같습니다.

 

1. 새로 생성된 객체가 Eden 영역에 할당한다.

2. 객체가 계속 생성되어서 Eden 영역이 꽉차게 되었을 때, 계속 사용되지 않을 객체는 해제하고, 그렇지 않은 객체는 비워져있는 Survivor 영역으로 이동한다. => Minor GC 동작

3. 위의 과정을 반복함으로써 하나의 Survivor 영역이 꽉 차면 남은 Survivor 영역으로 객체들을 모두 이동시킨다.

4. 위의 과정을 계속 반복하여 Young 영역이 다 차면, 3번 과정으로 옮겼던 Survivor 영역의 객체들을 Old 영역으로 이동시킨다. 

 

 

Old 영역에서 일어나는 Major GC는 Old 영역의 메모리가 계속 차서 부족해지면 객체를 삭제하는 것을 의미합니다.

 

 

 

 

가비지 컬렉션이 동작하는 방식

 

 

가비지 컬레션은 위와 같은 프로세스를 가지고 메모리 해제를 진행하게 되는데,

이는 Stop-the-world 방식으로 진행됩니다.

Stop-the-world란, GC가 객체들을 스캔하면서 어떤 객체가 무엇을 참조할 수 있는지 등을 판단하고, 사용되고 있는 메모리를 식별하는 Mark 작업과 Mark 가 되지 않은 객체들을 메모리에서 해제시키는 Sweep (Mark and Seep 동작)을 하기 위해서 JVM이 어플리케이션의 실행을 멈추는 작업입니다.

 

 

당연히 어플리케이션 실행이 멈추게 된다는 것은 실행중이던 모든 작업이 중단된다는 것을 의미하기 때문에 작업이 느려질 수 밖에 없습니다.

따라서 이 Stop-the-world로 인해 작업이 중단되는 시간을 줄이는 것을 GC 튜닝이라고 합니다.

이러한 작업을 통해서 가비지 컬렉션으로 다시 작업을 실행하는 데 까지 기다려야 하는 시간을 줄일 수 있습니다.

 

 

 

728x90
반응형