Stack
Primitive 타입(원시타입) - byte, short, int, long, double, float, boolean, char 타입의 데이터들이 할당된다.
데이터와 실제값이 stack에 같이 할당된다.
Heap 영역에 생성된 Object 타입의 데이터를 참조하는 레퍼런스 변수로도 할당된다.
지역변수들은 scope 에 따른 visibility 를 가진다.
각 Thread 는 자신만의 stack 을 가진다.
Heap
- Object타입 – String, Integer, ArrayList, Character, Byte, Boolean, Long, Double, Float, Short … 타입의
데이터들이 할당됨- Thread가 많아도 단 하나의 heap영역만 존재한다.
- Heap 영역에 있는 오브젝트들을 가리키는 레퍼런스 변수는 stack에 저장
- Object타입은 immutable하기 때문에 새로운 연산이 적용되면 새로운 Object가 heap에 추가로 할당된다.
Garbage Collection
Mark and Sweep 이라고도 말한다.
JVM의Garbage Collector가 스택의 모든 변수를 스캔하면서 각각 어떤 Object를 레퍼런스 하고 있는지 찾는 과정이Mark.
Marking 작업을 할때는 모든 thread가 중단된다. -> stop the world
이 과정을 통해 mark 되어있지 않은 Object들은 Heap에서 제거한다. ->Sweep즉 따로 garbage들을 수집, 제거하는 것이 아니라 mark를 보고 판단하여 즉각적으로 제거 과정이 이루어 진다.