프로세스(process)란 실행중에 있는 프로그램을 의미한다. (process는 task, job이라고도 한다.)
이때 각 프로세스는 독자적인 주소공간을 가지고있고, 그 주소공간이 어떤 구조로 이루어져있는지 확인한다.
Text
프로그램에 있는 함수 코드,제어문,상수등을 포함한다. Text
영역에는 실제 코드를 CPU가 실행할수 있는 기계어의 형태로 변환하여 저장하는 공간이다.
Data(BSS+GVAR)
전역변수 또는 Static 변수등이 저장되는 공간이다.
Heap
사용자가 생성한 객체들이 저장되는 공간이다.
Heap은 포인터를 사용해서 데이터를 조회한다.
동적할당되는 메모리 공간이며 java에서는 new 명령으로 할당할수 있다.
Stack
사용자가 작성한 함수에 대한 리턴 주소, 매개변수, 지역변수,등이 저장된다.
정적할당되는 메모리 공간이다.
Stack은 사용할수 있는 공간이 정해져있다. 즉 함수가 호출됨에 따라 call stack이 Stack영역에 쌓이게 되는데 재귀호출을 통해 무한히 call stack을 쌓게되면 언젠가 Stack 영역을 넘어서 stackoverflow가 발생하게 된다.
메모리 동적 할당
동적할당이란 프로그래밍에서 실행시간동안 메모리 공간을 할당하는 것을 말한다.
int[] a;
a = new int[5];
위 코드처럼 java에서 new
연산자등을 활용해 프로그램 도중 필요한 양만큼을 할당하는것이다.
프로그램 종료시 Garbage Collector가 정리한다.
메모리 정적 할당
정적할당이란 프로그램이 실행될때 이미 메모리의 크기가 결정되어있다는 뜻이다.
int[] a = new int[10];
정적할당시 위 코드처럼 메모리의 크기가 이미 하드코딩 되어있다.
정적할당시 함수의 호출이 끝나면 사라지지만 함수가 종료될때까지 안쓰는 메모리가 낭비될수 있다.
Garbage Collection(GC)란 Unreachable Object를 우선적으로 메모리에서 제거하여 메모리 공간을 확보하는 JVM에서 자동적으로 제공하는 기능이다.
여기서 Unreachable Object란 Stack 영역에서 접근할수 없는 Heap 영역의 객체를 말한다.
운영체제를 통해 JVM은 메모리를 할당받으며, JVM이 할당받은 메모리 구조는 위 사진과 같다.
Heap 메모리
JVM이 객체 또는 동적 데이터를 저장하는 곳이며(모든 Object타입(String,Integer,ArrayList..)), Garbage Collection(GC)이 일어나는 곳이기도하다.
Stack 영역과는 다르게 몇개의 스레드가 존재하든 하나의 Heap 영역만 존재한다.
Thread Stacks
스택메모리 영역이며, 프로세스의 스레드당 하나의 스택 메모리가 존재한다.
Stack 영역에는 Heap영역에 생성된 Object 타입의 데이터의 참조값이 할당되며,원시타입의 데이터가 값과 함께 할당된다.
Reference
https://dev.to/deepu105/visualizing-memory-management-in-jvm-java-kotlin-scala-groovy-clojure-19le
JVM(Stack & Heap )
https://yaboong.github.io/java/2018/05/26/java-memory-management/