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를 보고 판단하여 즉각적으로 제거 과정이 이루어 진다.