https://dzone.com/articles/java-memory-management
Stack에는 Heap영역에 생성된 Object타입의 데이터들에 대한 참조를 위한 값들이 할당된다. 또한, 원시타입(byte, short, int, double, float 등)의 데이터들이 할당된다. 이때 원시타입의 데이터들에 대해서는 참조값을 저장하는 것이 아니라 실제 값을 stack에 직접 저장하게 된다.
Stack영역에 있는 변수들은 visibility를 가진다. 변수 scope에 대한 개념이다. 전역변수가 아닌 지역변수가 foo()
라는 함수내에서 Stack에 할당된 경우, 해당 지역변수는 다른 함수에서 접근할 수 없다.
Stack 메모리는 Thread 하나당 하나씩 할당된다. 즉, 스레드 하나가 새롭게 생성되는 순간 해당 스레드를 위한 stack도 함께 생성되며, 각 스레드에서 다른 스레드의 stack영역에는 접근할 수 없다.
이제 Stack 이 어떻게 활용되는지 간단한 코드를 보면서 하나씩 살펴보자.
public class Main {
public static void main(String[] args) {
int argument = 4;
argument = someOperation(argument);
}
private static int someOperation(int param){
int tmp = param * 3;
int result = tmp / 2;
return result;
}
}
int argument = 4;
스택에 argument
라는 변수명으로 공간이 할당되고, argument
변수의 타입은 원시타입이므로 이 공간에는 실제 4라는 값이 할당된다. 현재 스택의 상태는 아래와 같다.