티스토리 뷰

Garbage Collection : Java Appliation에서 사용하지 않는 메모리를 자동으로 수거하는 기능. Java Appliation은 JVM(Java Virtual Machine)위에서 구동되는데, JVM의 기능 중 더이상 사용하지 않는 객체를 청소하여  메모리 공간을 확보하는 작업

(GC가 필요한 이유 : Heep 영역에 객체들이 계속 쌓이게 되면 OutOfMemoryException이 발생, 이를 방지하기 위해 주기적으로 사용하지 않는 객체를 수집하여 제거해줘함)

 

- Garcage Collector : 메모리가 부족할 때 쓰레기를 정리해주는 작업(Garbage Collection)을 수행하는 프로그램

    ㄴ 하는 일 : 메모리 할당, 사용중인 메모리 인식, 사용하지 않는 메모리 인식

- 자바에서는 크게 두 영역(Young / Old)으로 메모리를 구분한다

- Young(New) 영역 : 자바 객체가 생성되자마자, 또는 생성된지 얼마 되지 않은 객체들을 저장되는 곳.

자바 객체가 생성되면 이 영역에서 저장 되다가 시간이 지남에 따라 우선순위가 낮아지면 Old 영역으로 옮겨짐

- Old 영역 : Young(New) 영역에서 저장되어 있던 객체 중, 오래된 객체가 이동되어서 저장되는 장소

(*Perm 영역 : Class나 Method 등의 코드가 저장되는 영역으로, JVM에 의해서 사용됨)

- Stop The World : 가비지 컬렉션을 수행하기 위해 JVM이 애플리케이션의 실행을 일시 정지하는 것.

가비제 컬렉션이 실행되면 GC 작업을 맡은 스레드를 제외한 나머지 스레드는 모두 멈추게 되고 GC 작업이 종료되면 재개된다

 

 

 

Minor GC

- Young 영역에 대한 가비지 컬렉션을 Minor GC라 부른다. (Young 영역 중 Eden 영역이 꽉 차게되면 발생)

이 영역은 Eden / Survior 영역으로 또 나뉜다

    ㄴ Eden : 자바 객체가 생성되자마자 저장되는 곳. 이렇게 생성된 객체는 Minor GC가 발생하면 Survivor영역으로 이동

    ㄴ Survivor : Survivor1, Survivor2로 나뉨. Minor GC가 발생하면 Eden과 Survior1의 활성 객체를 Survivor2로 복사

- 활성이 아닌 객체는 자연스럽게 Survivor1에 남아있게 되고, Survivor1과 Eden영역을 클리어한다. 결과적으로 활성객체만 Survivor2로 이동하게 된 것

- 그 다음 Minor GC가 발생하게 되면 같은 원리로 Eden과  Survivor2 영역에서 활성객체를 Survivor1로 이동. 계속 같은 방식을 반복하여 Minor GC를 수행

- 이렇게 Minor GC를 수행하다 Survior영역에서 오래된 객체는 Old 영역으로 옮기게 된다.

- 이러한 방식의 GC 알고리즘을 Copy & Scavenge 라 한다

  ㄴ Stop The World 방식

  ㄴ 이 방식은 속도가 매우 빠르고, 작은 크기의 메모리를 콜렉팅하는데 매우 효과적   

  ㄴ Minor GC의 경우에는 자주 일어나기 때문에 GC에 걸리는 시간이 짧은 알고리즘을 사용하는게 적합

 

 

Major GC

- Old 영역이 가득차면 발생한다

- Minor GC 과정에서 삭제되지 않고, Old Generation영역으로 옮겨진 객체 중 미사용된다고 판단하는 객체를 삭제하는 GC

- 대표적으로 Mark & Sweep 알고리즘 사용

 

 

Full GC

- Heap 메모리 전체 영역에서 발생

- Old, Young 영역 모두에서 발생

- Minor GC, Major GC 모두 실패하거나 Young 영역과 Old 영역 모두 가득찼을때 발생 

- Full GC에 사용되는 알고리즘을 Mark & Sweep & Compact라고 한다

      ㄴ Mark & Sweep & Compact 알고리즘 :

       1). 객체들의 참조를 확인하면서 참조가 연결되지 않은 객체를 표시(Mark)한다.

       2). 1) 작업이 끝나면 사용되지 않는 객체를 모두 표시하고 이 표시된 객체를 (Sweep) 한다

       3). 메모리를 정리하여, 메모리 단편화를 해결할 수 있도록 한다.(Compact)        

- Full GC는 속도가 매우 느리고, 일어나는 도중에 순각적으로 자바 애플리케이션이 멈춰버리기 때문에 성능과 안정성에 아주 큰 영향을 미친다( 멈추는 동안 사용자의 요청이 큐에 들어있다가, 순간적으로 요청이 한꺼번에 들어오기 때문에 과부하에 의한 여러 장애가 발생할 수 있음)

 

 

참고 :

https://dongwooklee96.github.io/post/2021/04/04/gcgarbage-collector-%EC%A2%85%EB%A5%98-%EB%B0%8F-%EB%82%B4%EB%B6%80-%EC%9B%90%EB%A6%AC.html

https://devfunny.tistory.com/681

댓글
최근에 올라온 글
최근에 달린 댓글
링크
Total
Today
Yesterday