Intro
컴파일된 코드는 JVM에 의해서 실행되며, 하드웨어와 운영체제 기반의 이진형태로 사용된다.
이는 클래스 형식으로 파일에 저장된다.
JVM은 데이터 타입체킹을 진행하며, primitive 타입과 Reference 타입이 있다.
primitive type
boolean
numeric
returnAddress
Reference type
Run-Time Data Areas
런타임 데이터 영역은 프로그램의 실행동안 다양한 런타임 데이터 영역을 정의한다.
- 일부 데이터 영역은 시작 초반에 생성되고 JVM이 종료되는 시점에 사라진다.
- 일부 데이터 영역은 스레드 별로 만들어지며, 스레드 생명주기에 맞춰 생겨나고 사라진다.
PC Register
JVM은 실행중에 많은 스레드를 지원하며, 스레드 별로 각각의 PC 가 존재한다.
스레드별로 하나의 메소드가 작동중임을 의미
JVM Stack
JVM의 스레드는 개별의 스택을 가진다. 스택은 프레임을 저장하며 스택에는 지역변수 와 partial 결과 를 가진다.
- JVM의 스택은 PUSH POP 프레임을 제외하고 직접적으로 이용되진않는다.
- 프레임들을 힙에서 할당된다.
- 연속적일 필요는 없다.
exceptional condition
- 스레드에서의 계산이 더큰 JVM 스택을 요구한다면(허용치보다 더 큰), JVM은
StackOverflowError 를 던진다.
- JVM 스택이 동적으로 확장될수있다면, 확장이 시도되나 충분한 메모리로 확장에 영향을 준다. 이때 JVM은
OutOfMemoryError 를 던진다.
JVM Heap
JVM은 모든 쓰레드들끼리 공유하는 heap영역을 가진다.
- 힙은 런타임 데이타 영역으로 모든 클래스 인스턴스와 배열이 할당되는 공간이다.
- 힙은 vm이 시작될때 만들어지며 힙공간의 객체들은 자동 저장소 관리 시스템에 의해 관리된다. (가비지 컬렉터)
- 힙은 고정된 크기지만 요구에 의해 확장되기도 하며, 불필요한 경우 줄어들기도 한다.
exceptional condition
- 계산이 저장소 관리 체계에 의해 만들어진 이용가능한 공간볻 더 큰 공간을 요구한다면 JVM은
OutOfMemoryError 를 던진다.
Method 영역
메소드 영역은 모든 JVM 스레드들 간에 공유되는 공간으로 컴파일된 코드가 저장되어있다. (TEXT)
- 클래스별로 구조를 저장한다.
- VM 시작 단계에서 만들어진다.
- 논리적으로는 힙의 일부지만 간단한 구현들이라 가비지 컬렉이나 축소할 필요가 없다.
- 메모리의 연속할당부분은 아니다.
exceptional condition
- 메소드 영역에서 메모리는 할당 요구를 만족시키지 못한다면, JVM은
OutOfMemoryError 를 던진다.
Run-Time Constant Pool
클래스나 인터페이스 별로 있는 런타임이다.
- 여러 종류의 상수를 포함한다.
- 컴파일 시간에 결정되는 numeric literals 에서부터 런타임시간에 결정되는 레퍼런스까지 포함한다.
- 주로 메서드 영역에 할당되며, 클래스나 인터페이스가 생성될때 만들어진다.
exceptional condition
- 클래스나 인터페이스를 만들때 run-time constant pool의 생성이 메서드 영역의 범위보다 더 많은 메모리를 요구한다면, JVMDMS
OutOfMemoryError 를 던진다.
Native Method Stacks
Native Method : 프로세서에 의해 실행되는 JAVA 구현을 위한 바이너리 데이타 (C언어와 같은)
이 영역은 스레드 별로 할당되며, 고정된 크기 동적인 크기 두가지 모두 가능하다.
만일 고정된 크기라면 각 영역의 크기는 스택이 만들어 질때 독립적으로 골라진다.
exceptional condition
- 스레드에서 계산이 허용된 것 이상으로 더 큰 영역을 필요로 한다면, JVM은
StackOverflowError 를 던진다.
- 본 영역이 동적으로 확장되는 경우, 스택의 확장이 시도 되었으나 메모리가불충분한 경우, 불충분한 메모리로 인해 새로운 스레드를 위한 새로운 영역이 만들어 질수 없는 경우에 JVM은
OutOfMemoryError 를 던진다.
Frames
프레임은 데이타 혹은 부분적인 결과들을 저장하기위해 사용되는 것이다.
새로운 프레임은 메서드가 불릴때마다 생성되고, 메서드 호출이 끝나면 파괴된다. (메서드가 정상 리턴을 하든 예외 리턴을 하든 상관없다.)
프레임이 만들어진 스레드의 스택에 할당되며, 각 프레임은 다음과 같은 것들을 지닌다.
- 지역변수 배열 (컴파일 시간에 결정)
- 오퍼랜드 스택 (컴파일 시간에 결정)
- 현재 메서드가 있는 클래스의 런타임 상수 풀의 레퍼런스
- 이외에도 디버깅 정보
Summary
JVM은 이외에도 많은 알아야할 사항이 있다. 이번에는 메모리구조를 중심으로 살펴보고 싶어 공부해보았고, 기회가 된다면 다른 사항도 공부해야겠다.
(참고 링크) https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html