[Java] Stack And Heap

Java 의 Stack 과 Heap 메모리 관리

Posted by Wonyong Jang on March 14, 2020 · 4 mins read

Java 의 Stack 과 Heap

  • Java에서 메모리 관리는 어떻게 이루어지는지와 Stack과 Heap 영역의 역할에 대해 알아보자.

스크린샷 2020-10-18 오후 9 52 50

1) Stack

  • Heap 영역에 생성된 Object 타입의 데이터의 참조값이 할당된다.

  • 원시타입(primitive types)의 데이터들이 할당됨

    이때 원시타입(byte, short, int, long, double, float, boolean, char)의 데이터들의 참조값이 아닌 실제 값을 stack에 저장!

  • 각 Thread는 자신만의 stack을 가진다 (각 스레드에서 다른 스레드의 stack 접근 불가!!)
  • Stack 영역에 있는 변수들은 visibility를 가진다.

    변수 scope 에 대한 개념이다. 전역변수가 아닌 지역변수가 foo() 라는 함수내에서 Stack에 할당 된 경우, 해당 지역 변수는 다른 함수에서 접근할수 없다.

  • main() 함수 종료 되는 순간 stack 에 모든 데이터 pop
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;
    }
}

스크린샷 2020-10-18 오후 10 09 12

스크린샷 2020-10-18 오후 10 12 33

함수가 종료되어 지역변수들이 모두 pop되고, 함수를 호출했던 시점으로 돌아가면 스택의 상태는 아래와 같이 변한다.

스크린샷 2020-10-18 오후 10 13 04


2) Heap

  • 주로 긴 생명주기를 가진 데이터( 모든 데이터 중 stack에 있는 데이터를 제외한 부분이라고 생각해도 될 정도 )

  • 모든 Object 타입(Integer, String, ArrayList..) 은 heap영역에 생성된다.

  • 몇개의 스레드가 존대하든 상관없이 하나의 heap 영역만 존재한다.

  • Heap 영역에 있는 오브젝트들을 가르키는 레퍼런스 변수가 stack 에 올라간다.


2-1) Heap 예제

public class Main {
    public static void main(String[] args) {
        int port = 4000;
        String host = "localhost";
    }
}

위의 예제를 그림으로 확인해보자.

스크린샷 2020-10-18 오후 10 22 57

String Object를 상속받아 구현되어 있으므로 String은 heap 영역에 할당되고 Stack에 host라는 이름으로 생성된 변수는 heap에 있는 localhost라는 스트링을 레퍼런스 하게된다. 그림으로 표현하면 아래와 같다.

스크린샷 2020-10-18 오후 10 24 31

Heap 영역에 있는 데이터는 함수 내부에서 파라미터로 받아서 변경하고 함수 호출이 종료된 시점에 변경 내역이 반영되는 것을 확인!


2-2) Heap 예제

스크린샷 2020-03-14 오후 5 40 42 스크린샷 2020-03-14 오후 5 41 30 스크린샷 2020-03-14 오후 5 41 49 스크린샷 2020-03-14 오후 5 50 46 스크린샷 2020-03-14 오후 5 51 06 스크린샷 2020-03-14 오후 5 55 13 스크린샷 2020-03-14 오후 5 55 54 스크린샷 2020-03-14 오후 5 56 31 스크린샷 2020-03-14 오후 5 57 17




Reference

https://yaboong.github.io/java/2018/05/26/java-memory-management/