Java - JVM Stack and Stack Frame


JVM Stack and Stack Frame

  • 스레드는 각자만의 Stack 공간을 갖는다.

  • Stack Frame 은 그러한 Stack 안에 생성되는 공간이다.

  • Stack Frame 은 Stack 안에서 메서드마다 따로 생성되며, if 나 for 등 메서드 안에서 생성되는 중괄호 기준으로는 Stack Frame 안에서 내부 Stack Frame이 또 생성된다.

      public class Start {
         public static int test(int a) {
             return a + 10;
         }
         public static void main(String[] args) {
             int i;
             i = 10;
             double d = 20.0;
             if ( i > 5 ) {
                 d = 10.0;
             }
             i = test(i);
         }
      } 
    
    • 이런 코드가 있다.

    • 동작 순서는 다음과 같다.

    • JRE가 Start 클래스에서 main() 메서드가 있는지 확인한 후, JVM에 전원을 넣어 부팅한다.

    • import 된 java.lang 과 Start 클래스가 JVM static 영역에 올라간다.

    • 스택 영역에 main 스택 프레임이 생긴다.

    • main 스택 프레임 안에 args 라는 매개 변수가 들어간다.

    • main 스택 프레임 안에 args 위에 i = ? 가 쌓인다. ( 지역변수이므로 초기값 x )

    • i = 10 으로 바뀐다.

    • 그 위에 d = 20.0 이 쌓인다.

    • if ( i > 5 ) 라는 내부 스택 프레임이 생긴다.

    • d가 10.0 으로 바뀐다.

    • if ( i > 5 ) 라는 스택 프레임이 pop 된다.

    • test() 라는 새로운 스택프레임이 스택 영역안에 생긴다.

    • 그 스택 프레임 안에 int a = 10 라는 매개변수가 생긴다.

    • int a = 10 이 pop 된다.

    • test() 라는 스택 프레임이 사라진다.

    • i = 20 이 된다.

    • 위에서부터 차례로 스택 영역에서 pop 되며 지워진다.

    • 다 지워졌으면, JRE는 JVM을 종료시키고, JRE도 운영체제 상에서 지워진다.


  • 참고로 힙 메모리에 객체가 생기면, 그 상위 객체도 항상 함께 생긴다. 그래서 Object 객체는 항상 같이 생성된다.



외부스택프레임과 내부스택프레임은 서로 참조가 가능한가?

  • 서로는 아니다.

  • 내부 스택프레임은 외부 스택프레임을 참조 할 수 있지만, 외부 스택프레임은 내부 스택프레임을 참조할 수 없다.

      public static void(String[] args) {
         int i = 10;
         if ( i > 5 ) {
             i = 20;
             int a = 5;
         }
    		
         a = 10; // Error : 외부 스택프레임은 내부 스택프레임을 참조할 수 없음.
      }
    
    • 대충 이런 코드가 있다고 가정했을 때, main은 외부 if문은 내부 스택프레임이다.

    • if 문 안에서는 외부 스택프레임의 i 변수를 참조할 수 있지만,

    • main 에서는 내부 스택프레임인 if 속의 a 라는 변수를 참조할 수는 없다.






results matching ""

    No results matching ""