Garbage Collection과 Heap

2019. 1. 29. 01:34Study

JVM의 Runtime Area의 영역들은 Thread가 시작할 때 생성되는 경우가 있고,

JVM이 시작할 때 생성이되는 경우가 있습니다.


JVM이 시작할 때 생기는 영역이 바로 Heap입니다.


Heap은 new (객체 생성시) 인스턴스 및 배열이 저장되는 곳이며, 모든 Thread가 공유합니다.

객체의 생성이 빈번한 JAVA는 메모리 이슈가 이곳에서 발생하게됩니다.


그렇기 때문에 Garbage Collection은 Heap영역에서 발생합니다.


Heap은 Young 그리고 Old 영역으로 나뉩니다.


Young 영역은 하나의 Eden 영역과 두개의 Survivor 영역으로 구성되어있기때문에

JVM의 Heap은 4개의 영역으로 나뉜다고 볼 수있습니다. ( Young, Old, Eden, Survivor)


먼저, 객체가 new로 생성될 때, Eden 영역에 생성이됩니다.


그러다가 Eden 영역이 가득 차게 되면 Eden영역에서 Garbage Collection이 한번 발생되고

참조가 끊긴 객체는 Eden영역에서 지워지며 참조가 끊기지 않은 반대의 경우는 Survivor영역으로 이동하게 됩니다.


이 현상이 반복되면서 하나의 Survivor 영역이 가득 차게 되면 해당하는 Survivor의 영역에서 Garbage Collection가 발생합니다.


그리고 여기서 살아남은 객체들은 나머지 Survivor 영역으로 이동합니다.


이때 Garbage Collection이 발생한 Survivor 영역은 비어있어야합니다.


Survivor 1  <-----> Survivor 2 를 왔다갔다 반복하는 과정에서 계속 생존해있는 객체는 Old 영역으로 이동합니다.


만약에 Eden영역의 살아있는 객체가 Survivor영역보다 더 큰 경우(메모리 할당이 더 큰 경우 ? ) 바로 Old 영역으로 옮겨집니다.


이제 Garbage Collection에 대해 알아보겠습니다.


Garbage Collection은 Garbage Collector 가 Heap 메모리 영역에 할당된 더 이상 사용되지 않는 객체를 다른 객체가

 사용 가능하도록 제거하는 것을 말합니다.


Garbage Collection을 자동 메모리 관리 (automatic memory management)라고도 말합니다.


Garbage Collection의 대표적인 특징


1. Garbage Collection의 실행은 JVM (Java Virtual Machin)이 결정하며 개발자는 요청만 가능합니다.

2. Garbage Collection은 프로그래머가 구현할 수 없습니다.

3. 객체에 할당된 메모리를 명시적으로 해체할 수 없습니다.


Garbage Collection의 대상과 대상이 될 수 없는 경우


1. Garbage Collection의 대상은 객체이며 참조가 아닙니다.

2. Garbage Collection의 대상은 Thread가 더 이상 참조하지 않는 객체입니다.

3. 다른 참조 변수도 참조하고 있는 객체는 Garbage Collection의 대상이 될 수 없습니다.


Garbage Collection 대상 설정 방법


1. 참조 변수에 null 할당


ex) String name = new String("강남역");

     name = null;


2. 참조 변수에 다른 객체의 참조 값을 할당


   String student = new String("홍길동");

   String student2 = new String("임꺽정");

   student = student2;







'Study' 카테고리의 다른 글

람다(Lambda)란 무엇일까?  (2) 2019.10.23
Context란 무엇일까?  (0) 2019.05.07
4대 컴포넌트  (0) 2019.05.07
안드로이드 아키텍처란 무엇일까?  (0) 2019.01.22
안드로이드의 특징  (0) 2019.01.22