본문 바로가기

Java/JVM

[JVM] Stack & Frame

Stack

Each Java Virtual Machine thread has a private Java Virtual Machine stack, created at the same time as the thread. A Java Virtual Machine stack stores frames (§2.6). A Java Virtual Machine stack is analogous to the stack of a conventional language such as C: it holds local variables and partial results, and plays a part in method invocation and return.

---------- 중략 ----------

If the computation in a thread requires a larger Java Virtual Machine stack than is permitted, the Java Virtual Machine throws a StackOverflowError.
If Java Virtual Machine stacks can be dynamically expanded, and expansion is attempted but insufficient memory can be made available to effect the expansion, or if insufficient memory can be made available to create the initial Java Virtual Machine stack for a new thread, the Java Virtual Machine throws an OutOfMemoryError.

JVM에서 Thread가 생성될 때마다 Thread를 위한 Stack이 생성되며 Stack에는 Frame이 저장된다.
Thread가 연산을 하기위해 허용된 것 보다 큰 JVM Stack을 사용하는 경우 StackOverflowError가 발생한다.
Stack을 동적으로 확장을 시도하는 경우에 메모리가 부족하거나 새로운 Thread에게 Stack을 할당하는 경우에 메모리가 부족하면 OutOfMemoryError가 발생한다.


Frame

A frame is used to store data and partial results, as well as to perform dynamic linking, return values for methods, and dispatch exceptions.
A new frame is created each time a method is invoked. A frame is destroyed when its method invocation completes, whether that completion is normal or abrupt (it throws an uncaught exception). Frames are allocated from the Java Virtual Machine stack (§2.5.2) of the thread creating the frame. Each frame has its own array of local variables (§2.6.1), its own operand stack (§2.6.2), and a reference to the run-time constant pool (§2.5.5) of the class of the current method.

Frame은 "데이터 및 부분 결과를 저장"(DFS, BFS를 이해하는데 중요한 부분)하고 동적 연결을 수행하는 메서드에 대한 값을 반환하고 예외를 전달하는 데 사용된다. Frame은 메소드가 호출될 때마다 만들어지며 Stack에 저장된다.
Frame에 저장되는 정보는 아래와 같다.

  • Local Variables
  • Operand Stack
  • Constant Pool Reference

Local Variables

Each frame (§2.6) contains an array of variables known as its local variables. The length of the local variable array of a frame is determined at compile-time and supplied in the binary representation of a class or interface along with the code for the method associated with the frame (§4.7.3).

Local Variables(로컬 변수)는 메소드의 지역 변수를 배열로 저장하고 있다.

아래와 같은 메소드가 있다고 가정하였을 때

public int test() {
    int num = 10;
    Integer wrapperNum = 10;
    double doubleNum = 10.0d;
    Double wrapperDoubleNum = 10.0d;
}

Local Variables 변수에는 아래와 같이 저장이 된다.

variable value size
num 10 1
wrapperNum heap address 1
doubleNum 10.0d 2
wrapperDoubleNum heap address 1

double, long의 경우 배열의 두 칸을 차지한다. (자세한 사항은 공식문서 참고)
primitive 타입의 경우 프레임에 값이 저장되지만 wrapper class(Integer, Long 등)은 heap의 주소 값(reference)을 가지고 있다.


Operand Stack

Each frame (§2.6) contains a last-in-first-out (LIFO) stack known as its operand stack. The maximum depth of the operand stack of a frame is determined at compile-time and is supplied along with the code for the method associated with the frame (§4.7.3).

Frame마다 메소드 내에서의 연산을 위한 Operand Stack(피연산자 스택)을 가지고 있다.
JVM에서는 연산을 하기 위해서 Operand Stack에서 피연산자를 가져오고 연산이 끝나면 다시 Operand Stack으로 Push한다.


Run-Time Constant Pool

A run-time constant pool is a per-class or per-interface run-time representation of the constant_pool table in a class file (§4.4). It contains several kinds of constants, ranging from numeric literals known at compile-time to method and field references that must be resolved at run-time. The run-time constant pool serves a function similar to that of a symbol table for a conventional programming language, although it contains a wider range of data than a typical symbol table.

Run-time Constant Pool(런타임 상수 풀)은 constant_pool 테이블에 해당한다.
클래스와 인터페이스의 상수와 메소드의 필드에 대한 참조를 저장한다.
JVM은 Runtime Constant Pool을 통해서 인덱싱 된 메소드 또는 변수가 실제 저장되어 있는 메모리의 주소를 참조한다.


인용문 출처: 오라클 공식 문서 (링크)

'Java > JVM' 카테고리의 다른 글

[JVM] GC 벤치마크 결과 데이터  (0) 2022.01.23
[JVM] GC 벤치마크 결과  (0) 2022.01.23
[JVM] GC 벤치마크 분석 포인트  (0) 2022.01.23
[JVM] GC 벤치마크 개요  (0) 2021.12.23
[JVM] GC 알고리즘 종류  (0) 2021.12.02