DevBoi

[JAVA] 스택 & 힙 & Garbage Collector 본문

Language/[Java]

[JAVA] 스택 & 힙 & Garbage Collector

HiSmith 2022. 2. 18. 14:57
반응형

JVM : 메모리 관리 및 가비지 컬렉터 기능을 수행한다.

 

가비지 컬렉터 : 동적으로 할당된 메모리 영역중 사용하지 않는 영역을 탐지하여 해제하는 기능이다.

 

동적으로 할당되었다고 하면, Java의 힙을 얘기하는 것이다.

 

Stack : 정적으로 할당된 메모리 영역

원시 타입의 데이터가 값과 함께 할당, Heap 영역에 생성된 Object타입의 데이터 참조값 할당

 

Heap : 동적으로 할당된 메모리 영역

모든 Object 타입의 데이터가 할당 Heap영역의 Objecet를 가리키는 참조 변수가 Stack에 할당

 

쉽게 얘기해서, 저 메인 메소드 내의 로직이 처리 될때

Stack : 원시타입은 값 저장, Wrapper클래스는 참조값만 저장한다.

Heap : Object 하위 상속 받는 모든 객체들의 값이 담긴다.

 

그리고, 메인메소드가 끝나면, stack은 전부 pop 처리가 되고, Heap은 그대로 유지된다.

해당 Stack에서의 참조값이 사라졌지만, Heap에서는 남아있는 객체를 UnreachableObject라고한다.

그리고 해당 GC 대상이 된다.

 

GC 동작 원리

1. GC가 Stack의 모든 변수를 스캔하면서 각각 어떤 객체를 참조하고있는지 마킹한다. (Mark)

2. Reachable Object가 참조하고 있는 객체도 찾아서 마킹한다.(Mark)

3. 마킹되지 않는 객체를 HeaP에서 제거한다.(Sweep)

 

즉 Stack에서 참조되고있는걸 마킹하고 참조되지 않고있는 Object를 찾아서 제거한다고 보면된다.

 

GC 동작 시점

 

Heap은 New Generation과 Old Generation 영역으로 나뉘어져있다.

 

NewGeneration의 Eden은 새로운 객체가 할당되는 영역이다.

해당 Eden이 계속된 신규 객체로 인해 할당이 되어 꽉차게 되면 GC가 발생한다.(Minor GC)

GC가 발생하면서 Unreachable Object에 대한 sweep 과정이 진행되고, 이 과정이 지나도 여전히 reachable 인 Object에 대해선

Survival 0으로 옮기게 된다.

또한 Eden영역에서 Unreachable  object에 대해서는 메모리에서 해제한다.

 

이 과정을 반복하면, Eden에서 survival 0으로 채우고, 해당 Survival 0영역이 꽉차면 

해당 Eden에서 GC작업하는 것과 같이 Survival0 영역에 대해서 Sweep 작업을 이루게 된다.

해당 Survival0 영역에서 살아남은 Object는 age값을 증가시킨 채로, Survival 1영역으로 이동하게 된다.

 

만약에, Eden에 대한 신규 Object를 생성하고 꽉차서 GC후에, 해당 영역으로 옮기때는

Survival0영역으로 가는것이 아니라, 이미 객체가 차있는 곳으로 간다. 즉, Survival 영역은 항상 한개는 비어있다고 보면된다.

 

즉 Survival1이 차기 시작하면  에덴 -> 서바이벌0 이 아니라 에덴 -> 서바이벌1이다

 

만약에 서바이벌1이 다차면, 또 age값이 증가한채로 서바이벌0에 차기 시작한다.

서바이벌 영역은 와따리 가따리 하면서 차지만 age는 계속 증가된걸 볼수있다.

 

age값이 계속 증가하다가, 특정 age값을 넘어서면, Old Generation영역으로 옮겨진다. (Promotion)

Old Generation 영역이 다차면, Major GC가 발생하여 같은 행위를 하고 이를 바탕으로 전체적으로 메모리가 관리된다.

 

 

 

 

 

반응형

'Language > [Java]' 카테고리의 다른 글

[Java] Java heap_memory 에 대해서  (0) 2022.02.19
[Java] JVM 동작 과정  (0) 2022.02.18
[Java] 제네릭의 이해  (0) 2022.02.17
Java 리플렉션 이란?  (0) 2021.12.06
JAVA stream _ 심화  (0) 2021.09.05