Heap 영역에 생성된 Object 타입의 데이터의 참조값이 할당된다.
이때 원시타입(byte, short, int, long, double, float, boolean, char)의 데이터들의 참조값이 아닌 실제 값을 stack에 저장!
변수 scope 에 대한 개념이다. 전역변수가 아닌 지역변수가 foo() 라는 함수내에서 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;
}
}
함수가 종료되어 지역변수들이 모두 pop되고, 함수를 호출했던 시점으로 돌아가면 스택의 상태는 아래와 같이 변한다.
주로 긴 생명주기를 가진 데이터( 모든 데이터 중 stack에 있는 데이터를 제외한
부분이라고 생각해도 될 정도 )
모든 Object 타입(Integer, String, ArrayList..) 은 heap영역에 생성된다.
몇개의 스레드가 존대하든 상관없이 하나의 heap 영역만 존재한다.
Heap 영역에 있는 오브젝트들을 가르키는 레퍼런스 변수가 stack 에 올라간다.
public class Main {
public static void main(String[] args) {
int port = 4000;
String host = "localhost";
}
}
위의 예제를 그림으로 확인해보자.
String Object를 상속받아 구현되어 있으므로 String은 heap 영역에 할당되고 Stack에 host라는 이름으로 생성된 변수는 heap에 있는 localhost라는 스트링을 레퍼런스 하게된다. 그림으로 표현하면 아래와 같다.
Heap 영역에 있는 데이터는 함수 내부에서 파라미터로 받아서 변경하고 함수 호출이 종료된 시점에 변경 내역이 반영되는 것을 확인!
Reference
https://yaboong.github.io/java/2018/05/26/java-memory-management/