해당 언어의 메모리 구조를 알아야 고급 개발자가 된다고 생각한다. 그리고 이전 포스팅에서 JVM의 메모리 구조를 다 이해하지 못했다. 따라서 메모리 구조를 탐구하기로 했다.
여담이나 T메모리라는 용어는 “스프링 입문을 위한 자바 객체지향의 원리와 이해”라는 책에서 나온 용어이고, 영미권에서는 heap과 non-heap으로 구분하고 있는듯 하다.(불확실함)
자바 프로그램이 OS에서 실행될 때, OS가 JVM에 할당하는 메모리 영역. 용도에 따라 다른 공간을 사용한다.
이전 게시물의 Runtime Data Areas영역과 같다.
사실 JVM 메모리 구조는 이전 게시물처럼 복잡하나 이해하기 쉽게 이와같이 나타낸다.
전역변수와 static 멤버변수를 저장한다. 프로그램이 시작할 때부터 끝날 때까지 메모리에 남아있는다.
또한 메인 메소드가 실행되기 전에 JVM이 java.lang패키지, import한 패키지, 프로그램 상의 클래스들을 스태틱 영역에 배치한다.
메소드, if와 같은 괄호 블록 내에 정의된 지역변수(기본자료형)의 데이터 값이 저장되는 공간이다. 호출될 때 할당되고 종료되면 없어진다.
예시를 들어보자.
class 클래스이름{ public static void main(String[] args){ if(){ int b=3; } System.out.println(b) //에러. 왜? } }
b는 if문 내에서만 쓰이는 변수이기에 구문 밖에서는 호출할 수 없다.
이 stack은 어떤 식으로 운용되기에 위와 같은 일이 벌어지는가?
The Java stack is composed of stack frames (or frames). A stack frame contains the state of one Java method invocation.
호출된 메소드의 상태를 집어넣는 곳
if문, for문, 메소드 등의 {
를 만나면 스택 프레임이 할당되고, }
를 만나면 사라진다.
몇가지 예를 들자면,
class 클래스이름{ public static void main(String[] args){ if(){ int b=3; } System.out.println(b) //에러. 왜? } }
💡 위의 예시에서는 if문의 스택 프레임이
}
를 만나 해제되었기 때문에 main안에서 접근할 수 없었던 것이다.
그나저나 메소드는 저마다 갖고 있는 지역 변수, 파라미터, 사용 영역도 달라 사이즈도 다를 텐데, 어떻게 스택 프레임의 크기가 정해지는가?
The sizes of the local variables and operand stack, which are measured in words, depend upon the needs of each individual method. These sizes are determined at compile time and included in the class file data for each method.
컴파일 시간에 지역 변수 크기, 피연산자 스택(operand stack), word에 따라 결정된다.
자바 프로그램 실행 도중 생성된 객체(또는 인스턴스)가 저장되는 공간이다. 또한 참조형 자료형도 저장된다.
힙 영역 내 객체들은 다른 객체의 메소드에 의해 참조될 수 있다. 또한 스택 영역에서도 참조할 수 있다.
힙 내에서도 객체가 처음 생성됐을 때 저장되는 공간과 객체의 사용이 오래되었을 때 이동되는 공간으로 나뉘어 관리된다. 사용이 오래되거나 참조하는 변수가 없어지면 객체가 필요 없는 것으로 간주하고 Garbage Collector가 할당을 해제한다.
자동차 디자이너가 되려면 자동차가 어떻게 굴러가는지 알아야 하는 법이다...
스택프레임의 사이즈 결정부분에서 operand stack이라는 용어를 처음 보았다. VM과 연계된 개념인 것 같은데 다음 포스팅은 이 부분에 대해서 써보고 싶다.
stack - https://tape22.tistory.com/28
JVM static 전처리, stack frame-https://velog.io/@maketheworldwise/T-메모리-구조
stack frame - https://www.artima.com/insidejvm/ed2/jvm2.html
stack frame사이즈 - https://alvinalexander.com/scala/fp-book/recursion-jvm-stacks-stack-frames/
stack, static, heap - https://sehun-kim.github.io/sehun/JVM/
heap - https://hyoje420.tistory.com/2
operand stack - https://www.korecmblog.com/jvm-stack-and-register/
좋은 글 감사합니다.
스택과 힙에 대해서는 대략 알고 있었지만, 자바의 Stack에서는 어떤 원리로 쌓이는지 자세히 알지 못했었는데, 이번 기회에 배울 수 있었습니다!
좋은 글 감사합니다!
평소 스택과 힙은 알고리즘 문제를 풀 때 원리정도만 이해하고 있어 실제로는 어떤 환경에서 구동하는지에 대한 의문이 있었는데 자바 내부에서도 다양한 방면으로 실행되고 있다는 것을보니 신기하네요!
글 잘 읽었습니다.
실제로 코딩할 때 메모리 관련 이슈가 나오면 별다른 생각 없이 코드를 고쳤었는데, 메모리 관련 설명을 깔끔하게 해주셔서 코딩할때 도움이 많이 될 것 같습니다~!