자바의 메모리 구조를 설명하기에 앞서 자바 언어의 특징인 플랫폼 독립적을 이야기 하겠습니다.
자바언어는 "OS에 구분되지 않고 동작한다" 이것이 JVM 덕분입니다.
JVM은 자바의 바이트 코드를 실행하 수 있게 해주는 주체이여 OS뿐만 아니라 CPU에도 구애받지 않고 실행됩니다.
출처 : https://www.guru99.com/java-virtual-machine-jvm.html
Memory 영역인 Runtime Data Area를 기반으로 하여 Execution Engine, Class Loader, Garbage Collector가 있습니다.
stack의 경우 정적으로 할당된 메모리 영역입니다. 원시타입의 데이터값이 할당이 되고 Heap 영역에 생성된 Object 타입의 데이터의 참조값이 할당 됩니다.
Stack 의 메모리는 Thread당 하나씩 할당 됩니다. 새로운 Thread가 생성되면 Stack이 새롭게 생성되고 각 Thread끼리는 Stack 영역을 접근할 수 없습니다.
Heap의 경우 동적으로 할당된 메모리 영역입니다.
Heap 영역에서는 모든 Object타입의 데이터가 할당 됩니다. Heap 영역의 Object를 가리키는 참조변수가 Stack의 할당됩니다.
Heap 영역의 데이터는 Life-Cycle이 길다 그 이유는 Object의 크기가 크고 서로 다른 코드블럭에서도 공유가 됩니다.
Heap은 Stack처럼 Thread마다 하나씩 있는것이 아니라 여러개의 Thread가 있어도 Heap은 단 하나의 영역만 존재한다.
간단히 말해서 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역 스택 영역의 크기는 컴파일 시에 결정 스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸. LIFO
힙 영역에 대해서 설명하자면 주로 긴 생명주기를 가지는 데이터들이 저장된다.
대부분의 오브젝트는 크기가 크고, 서로 다른 코드블럭에서 공유되는 경우가 많기 때문에 stack에 있는 데이터를 제외한 부분.