자바에서 GC.. 한번쯤 들어봤을 것이다.

그런데 책에서 보니 GC 가 Garbage Collector 인지, Garbage Collection 인지 잘 구분이 안 간다. 


그래서 Oracle doc 에서 대충 검색을 때려보니(?)

..... 얘네도 그렇게 뚜렷히 구분하는 것 같지는 않은 듯.

Garbage Collector (GC) 해놓은 문서도 있고, Garbage Collection (GC) 해놓은 문서도 있다.

음....뭐 그런가 보다. 지금 이 얘기 하려는 건 아니니까.



C와는 다르게 JAVA 는 메모리 해제 작업을 따로 안 해주는 게 특징이다.

GC 가 알아서 '사용했다가 더 이상 사용되지 않는 녀석들'을 치워주기 때문이다.


JDK 7부터 G1(Garbage first) 를 제외한 나머지 JVM 은 다음과 같이

Heap 이라는 공간에 객체들을 관리한다고 한다. - 여기서부터는 책의 내용 일부를 그대로 가져온다 -


< 자바의 힙 영역 >


Eden 

Survivor 

Space 

Virtual 

 

Virtual 

 

Virtual 



초록색 부분은 Young 영역, 파란색 부분은 Old 영역, 분홍색 부분은 Perm 영역 이라고 한다.


가장 왼쪽의 Young 영역에는 젊은 객체들이, Old 영역에는 늙은 객체들이,

Perm 영역에는 클래스나 메소드에 대한 정보가 쌓인다. (Perm 에는 더 많은 정보들을 담고있지만 생략)


- Young 영역은 Eden 과 2 개의 Survivor 영역으로 나뉘는데, 이 중에서 객체를 생성하자마자

저장되는 장소는 Eden 이다. 일반적으로 Java 에서 메모리가 살아가는 과정은 다음과 같다.


1) Eden 영역에서 객체가 생성된다.

2) Eden 영역이 꽉 차면 살아있는 객체만 Survivor 영역으로 복사되고 나서 다시 Eden 영역을 채우게 된다.

3) Survivor 영역이 꽉 차면 다른 Survivor 영역(Space)로 객체가 복사된다.

이때, Eden 영역에 있는 객체들 중 살아있는 객체들도 다른 Survivor 영역으로 간다.

즉 ! Survivor 영역의 둘 중 하나는 반드시 비어 있어야만 한다.


지금까지 말한 것이 minor GC 혹은 Young GC 라고 부른다. (여기서 GC는 가비지 콜렉션)


그러다가 오래 살아있는 객체들은 Old 영역으로 이동한다. 지속적으로 이동하다가 Old 영역이 꽉 차면

GC 가 발생하는데 이것을 major GC 혹은 Full GC 라고 부른다.



Young GC 와 Full GC 중 Young GC 가 더 빠르다.

일반적으로 더 작은 공간이 할당되고 객체들을 처리하는 방식도 다르기 때문이다.

그렇다고 전체의 Heap 영역을 Young 영역으로 만들면 장애가 생길 확률이 높으니 신중하자.



자바의神 Vol.1 내용은 여기까지 이다. - 이 포스팅은 부록 부분에서 발췌 -

사실 더 많은 내용들이 있어도 굳이 포스팅 안 한 이유는 귀찮아서

대부분 알고 있는 내용이고... (하지만 누가 물어보면 잘 대답할 수 있을지는 조금 걱정) 

지금 공부할 건 많고.. 디자인 패턴 포스팅 하는 것도 버겁다 ㅠㅠㅋㅋㅋ


아무튼 Vol.2 로 넘어갈지 고민중이다.


by kelicia 2014. 5. 26. 21:25