기록하는 습관을 들이자

[Java] GC(Garbage Collection) 본문

알고리즘/Java

[Java] GC(Garbage Collection)

myeongmy 2020. 9. 23. 22:24
반응형

* 해당 내용은 CS(Computer Science) 스터디를 하며 공부한 내용을 작성한 글입니다.

 

Java와 C의 차이점?

"Java에서는 개발자가 프로그램 코드로 메모리를 명시적으로 해제하지 않기 때문에 가비지 컬렉터(Garbage Collector)가 더 이상 필요 없는 (쓰레기) 객체를 찾아 지우는 작업을 한다."

 

Garbage Collector란?

동적으로 할당한 메모리 영역 중 더 이상 사용하지 않는 영역을 탐지하여 해제하는 역할을 한다. 여기서 "더 이상 사용하지 않는 영역"은 **더 이상 참조되지 않는 객체(Unreachable Object)**를 의미한다.

 

더 이상 참조되지 않는 객체(Unreachable Object)의 의미

Java에서 이야기하는 Unreachable Object를 아래 예제를 통해 순차적으로 살펴보면,

Integer i = new Integer(4);
// 참조변수 i는 새로운 Integer 객체 인스턴스(4)를 가리킨다.

위와 같은 코드가 실행되면, JVM 메모리 영역에는 다음과 같은 변화가 생긴다.

참고: JVM 메모리 영역(힙 영역, 스택 영역)

더보기

힙(Heap) 영역: 동적으로 할당한 메모리 영역으로 모든 Object 타입의 데이터가 할당된다. 힙 영역의 객체를 가리키는 참조 변수가 스택 영역에 할당된다.

스택(Stack) 영역: 정적으로 할당한 메모리 영역으로 원시 타입의 데이터가 값과 함께 할당된다. 힙 영역에 생성된 Object 타입의 데이터의 참조 값이 할당된다.

 

힙 영역의 객체를 스택 영역의 변수가 가리키게 된다.

i = null;
// 참조변수 i가 null로 할당됨.

그런데, 다음과 같이 참조 변수에 null을 할당하면,

이전 참조 관계가 끊기면서 Integer(4) 객체는 어느 누구도 참조하지 않는 객체가 되었다. 이러한 객체를 Unreachable Object라고 부르고, GC(Garbage Collector)의 대상이 된다.

 

GC(Garbage Collection) 과정

Java의 garbage collector는 기본적으로 Mark-and-Sweep 알고리즘을 따른다.

(참고로 C언어와는 다르게, deallocating memory과정은 가비지 컬렉터에 의해 자동으로 실행된다.)

 

Step 1 : Marking

가비지 컬렉터는 메모리에서 live object를 확인 하고, unreachable object가 무엇인지 마킹하는 절차를 진행한다.

 

 

Step 2: Normal Deletion(삭제)

가비지 컬렉터는 unreachable object를 삭제한다.

 

 

Step 3: Deletion with Compacting(압축)

가비지 컬렉터중 일부는 memory를 더욱 효과적으로 쓰기위해 unreachable object를 삭제함과 동시에 압축을 진행하기도 한다.

 

 

Java Garbage Collector의 종류

 

  1. Serial GC
-XX:+UseSerialGC

주로 CPU 코어가 1개 있을 때 사용하는 방식으로 GC를 처리하는 스레드가 1개이다.

 

   2. Parallel GC

-XX:+UseParallelGC

GC를 처리하는 스레드가 여러 개로 Serial GC보다 객체를 빠르게 처리할 수 있다. Parallel GC는 메 모리가 충분하고 코어의 개수가 많을 때 사용하면 좋다.

 

 

기타 용어 정리

 

# Young Generation : 최초로 new object가 생성되었을 경우 heap memory에서 위치하는 공간. MinorGC가 발생하면 unreachable object는 삭제되고, surviving object(참조되고 있는 객체들)은 Old generation으로 이동한다.

# Old Generation : Long surviving object들이 머무는 공간. Old generation이 가득차게되면 MajorGC가 발생한다.

# MinorGC : Young generation에서 발생하는 GC

# MajorGC : Old Generation에서 발생하는 GC

# Full GC : Heap memory전체를 clear하는 작업

# Stop the World Event : MinorGC 발생시 Stop the world event가 발생한다. MinorGC를 수행할때는 모든 application thread가 중지하고, 예외는 없다.

# Permanent generation : Java application에 필요한 클래스의 메타데이터를 자장하는 곳. Java8을 기준으로 Permanent generation은 heap memory가 아닌 native memory로 관리됨.

반응형
Comments