크게 다음이 있다.
- Stack
- Heap
- Static
- Metaspace
Stack
- 변수(primitive든 reference든)
- 객체 자체는 Heap에 할당되고, 그 객체에 대한 참조만이 변수에 저장된다.
- thread 별로 별도의 stack이 존재한다.
- method 호출 시 method frame이 load된다(대충 C의 스택 프레임으로 생각하면 됨).
Heap
- 전에는 method area라 했음
- class, field, method에 대한 metadata
- class를 메모리에서 unload할 때까지 존재한다.
Static
- string literal
- static field
- static methods
- static object(static class의 instance)
- 가장 먼저 메모리에 load돼서 가장 나중에 unload됨
-> 함부로 쓰지 말자
'static'이라는 것은
- 변하지 않는 게 아니라 거의 안 변하지만 변할 수 있는(can) 것