[Java] 자바 메모리 모델(쓰레드 스택, 힙)

sonnie
lucky-sonnie
Published in
2 min readJan 18, 2021

아래 출처 블로그에서 내가 필요하다고 생각하는 부분만 추려서 번역해보았다.

JVM에서 메모리를 Thread stack과 heap 으로 나눈다. JVM에서 돌아가는 각 스레드는 각각의 thread stack이 있다.

스레드 스택은 스레드가 현재 실행 시점에 어떤 메소드를 호출했는지에 대한 정보를 담고 있다. 스레드 스택은 메소드가 실행될 때 필요한 지역 변수들(local variables)을 갖고 있다. 스레드는 자기 스레드 스택에만 접근할 수 있다. 스레드에 의해 생성된 지역 변수들은 본인 스레드 스택이 아니면 다른 스레드에게 보여지지 않는다. primitive type의 모든 지역 변수는 스레드 스택에 모두 저장되고 다른 스레드에게 보이지 않는다.

자바 어플리케이션에서 만들어지는 모든 객체들 (Wrapper class 포함)이 heap에 저장된다. 객체가 생성되고 지역 변수에 할당 되었는지, 아님 다른 객체의 멤버 변수로 생성되었는지에 상관 없이 모든 객체는 힙에 저장된다.

지역 변수가 객체를 참조할 수 있다. 이 경우 참조값은 스레드 스택에 저장되지만 객체는 힙에 저장된다. 객체에 메소드가 있고, 그 메소드는 지역 변수를 가지고 있을 수 있다. 이 때 객체의 메소드가 heap에 저장되더라도 메소드 안에 있는 로컬 변수들은 스레드 스택에 저장된다. 객체의 멤버 변수(primitive type, reference type 상관 없이)도 객체와 함께 힙 영역에 저장된다.

static 키워드로 선언된 변수와 클래스도 힙에 저장된다. 힙에 있는 객체들은 모든 스레드에서 접근 가능하다. 만약 2개의 스레드가 같은 객체의 메소드를 호출한다면 그 객체의 멤버변수에 동시에 접근하겠지만, 각 스레드는 지역 변수의 복사본을 갖게 된다.

http://tutorials.jenkov.com/java-concurrency/java-memory-model.html

출처 : https://medium.com/javarevisited/java-concurrency-java-memory-model-96e3ac36ec6b

--

--