간단한 개발관련 내용

GC(Garbage Colloection)는 언제 발생할까? 본문

Programming/Java

GC(Garbage Colloection)는 언제 발생할까?

vincenzo.dev.82 2015. 3. 6. 00:51
반응형


예전 블로그 복사 - http://blog.daum.net/7dbwnckd/4696550


GC(Garbage Colloection)는 언제 발생할까?

1. GC의 원리

 - 메로리 할당

 - 사용 중인 메모리 인식

 - 사용하지 않는 메모리 인식

 

 - JVM의 메모리는 크게 클래스 영역, 자바 스택, 힙, 네이티브 메소드 스택 4개 영역으로 나뉘지만, 가비지 컬렉터가 인식하고 할당하는 자바의 메모리 역역에 대해 공부하자!!(힙)

  Young, Old, Perm(permanent)의 세 영역으로 나누어지는데,

  Young 영역은 Eden, Survivor1, Survivor2

  Old 영역은 메모리영역

 * 일단 메모리에 객체가 생성되면, Eden영역에 객체가 지정된다. Eden영역에 데이터가 어느 정도 쌓이면, 이영역에 있던 객체가 어디론가 옮겨지거나 삭제된다. 이 때 옮겨지는 위치가 Survivor영역이다. 우선순위는 없으며 두 개의 영역 중 한 영역은 반드시 비어 있어야 한다. 그 비어 있는 영역에 Eden 영역에 있던 객체가 할당된다. 할당된 Survivor 영역이 차면, GC가 되면서 Eden 영역에 있는 객체와 꽉 찬 Survivor 영역에 있는 객체가 비어 있는 Survivor 영역으로 이동한다. 그러다가 더 큰 객체가 생성되거나, 더 이상 Young 영역에 공간이 남지 않으면 객체들은 Old 영역으로 이도하게 된다.

 

2. GC의 종류

 - 마이너 GC : Young 영역에서 발생하는 GC

 - 메이저 GC : Old 영역이나 Perm 영역에서 발생하는 GC

 이 두 가지 GC가 어떻게 상호 작용하느냐에 따라서 GC 방식에 차이가 나고, 성능에도 영향을 준다. GC가 발생하거나 객체가 각 영역에서 다른 영역으로 이동할 때 애플리케이션의 병목이 발생하면서 성능에 영향을 주게 된다. 그래서 핫 스팟(Hot Spot) JVM에서는 스레드 로컬 할당 버퍼(TLABs: Thread-Local Allocation Buffers)라는 것을 사용한다  이를 통하여 각 스레드별 메모리 버퍼를 사용하면 다른 스레드에 영향을 주지 않는 메모리 할당 작업이 가능해진다.

 

 

반응형