티스토리 뷰

Runtime Data Areas는 JVM이 운영체제로부터 할당받는 메모리 영역을 의미한다. JVM의 클래스 로더가 메모리에 바이트코드를 올리면, JVM의 Execution Engine은 JVM 메모리에 올라온 바이트코드들을 명령어 단위로 하나씩 가져와서 기계어로 변환시킨다. 변환된 기계어는 JVM의 메모리구조(Runtime Data Area)의 각 영역에 배치되며 GC와 함께 실행된다.

 

 

Runtime Data Areas (5개)

* 오라클(과거의 썬 마이크로시스템즈)의 HotSpot JVM 기준

https://hoonmaro.tistory.com/19

모든 Thread 공유

1) Method(Static) Area

  • Method Area, Class Area, Code Area, Static Area 라고도 불린다.
  • JVM의 Execution Engine(실행엔진)이 프로그램을 실행시키려면 바이트코드들이 메모리에 올라가 있어야 하며 이것들이 Method 영역에 올라간다.
  • 바이트코드를 메모리에 올리는 과정을 '클래스 로딩'이라고 하며 클래스를 사용할 시점(런타임 도중)에 동적으로 이루어진다. (클래스 로더가 동적으로 메모리에 올림)
  • 정확히 말하면 로딩할 클래스에 대한 정보를 메모리에 올린다. JVM에서 읽어온 클래스와 인터페이스 정보 등 클래스정보(멤버변수의 이름), 변수정보(데이터타입, 접근제어자정보), 메소드정보(메소드 이름, 리턴타입, 파라미터, 접근제어자 정보), static변수(프로세스 초기 로딩시점), final class변수, Constant pool(상수풀 : 문자상수, 타입, 필드, 객체참조가 저장됨)등을 분류되어 저장된다.
  • 즉, 메소드가 호출되려면 그 메소드를 갖는 클래스 파일이 메모리에 로딩되어야 하기 때문에 method 영역이 존재하는 것이고 메모리의 'method 영역으로 로딩이 되면' 인스턴스화 가능하다.
  • static 필드나 메소드는 프로세스 로딩시부터 로딩되어 있다.

2) Heap Area

  • 실제로 런타임시 생성된 객체의 실체가 저장된다.
  • Method Area에 로드된 클래스만 생성이 가능하다.
  • Stack 영역과 달리, 객체가 사용되어지지 않더라도 Heap 영역에 남아있다가 GC에 의해 제거된다.
  • GC의 주요 대상이되며 효율적인 GC를 위해 메모리 영역이 분리되어 있다.(Eden, Survivor1,2, Old)

 

 

개별 Thread 할당

1) Stack Area

  • 메소드를 호출할 때마다(또는 쓰레드가 생성될 때마다) 개별적으로 스택이 생성되며 리턴 시 영역에서 해제된다.
  • A메소드가 B메소드를 호출하는 상황이라면 A메소드의 정보를 Stack에 백업(push)해 두고, B메소드가 종료되면 Stack에서 pop한다.(call stack)
  • 지역변수, 매개변수, '리턴 주소' 등이 저장된다. (스택 프레임에 어떤 순서대로 변수를 저장하는지가 중요 - call stack 참고)
  • 쓰레드 마다 Stack을 가지며 쓰레드들 간 서로의 Stack에 접근할 수 없다고 가정한다.(TreadLocal 변수를 통해 접근가능)
  • Stack Frame의 크기는 각각 다를 수 있지만 가변이 아니며 컴파일시에 결정되어 있다.
  • Stack 영역에는 주로 Heap 영역에 저장된 실체의 주소 값이 저장된다.하지만 이는 reference에 한정된 설명이고, primitive type의 경우 Stack에 값 자체가 저장된다.

2) PC Register

  • 쓰레드가 생성될때마다 생성되며 현재 쓰레드가 수행중인 JVM Instruction의 주소를 저장한다. (다음에 몇 번째 줄을 실행할 지)
  • Register-Base로 구동되는 방식이 아니라 Stack-Base로 동작한다. Stack-Base란 CPU에 직접 Instruction을 수행하지 않고 Stack에서 Operand를 뽑아내 이를 별도의 메모리 공간에 저장하는 방식을 말하며 이러한 메모리 공간을 PC Registers라고 한다.
  • 즉, 실제 레지스터에 PC값을 저장하는 게 아니라, 스택을 사용한다. 자바는 다양한 네트워크 디바이스에서 균일하게 동작하기를 보장하기를 원한다. 디바이스마다 레지스터 수는 다르다. 즉, 각 디바이스마다 몇 개의 레지스터가 있을 지 가정할 수 없다. 그래서 레지스터 기반으로 PC값을 저장하는 순간 컴퓨터 아티텍처에 관여하게 되는 것이다. 하지만 PC를 스택에 저장하면 최소한 하드웨어 스팩에 관여를 하지 않게 된다(하드웨어 스팩을 추상화 함). 이는 JVM이 있기 때문에 가능한 것이다. 하지만 레지스터에 캐싱하지 않는다면 Register-Base 방식보다 느릴 수 있다.

3) Native Method Stack Area

  •  자바 외의 언어로 작성된 프로그램, API tool-kit 등과의 통합을 쉽게 하기 위하여 JNI(Java Native Interface)라는 표준 규약을 제공하는데, JNI를 통해 다른 언어로 구성된 코드를 실행시킬 수 있다. 보통 OS가 구현된 C/C++, 어셈블리언어 등으로 구성된 함수들을 사용할 수 있도록 하기 위해 존재한다. 예를들어 I/O 작업을 위해선 OS의 직접적인 도움(시스템 콜)이 필요하며 이때 필요한 함수들을 실행하기 위한 방법을 제공한다.
  • 최근 오라클의 Hotspot JVM이나 IBM JVM은 Stack 영역과 Native Method Stack 영역의 구분을 두지 않으며 통합하여 관리한다.

 

 

https://jithub.tistory.com/40

 

static 키워드

static 키워드를 사용하면 프로세스 시작 부터 해당 '바이트코드'가 static영역(Method 영역)에 올라가게 된다. 즉, 클래스 로더가 동적으로 관련 바이트코드를 메모리에 올리지 않고, 시작시부터 올리는 것이다. static 메소드가 stack영역에 쌓이지 않는다고 이해하면 안된다.

 

정리

- 'JVM의 클래스 로더'가 런타임시 동적으로 메모리의 Method Area에 클래스의 바이트코드(.class)를 올린다.

- JVM의 실행엔진(Execution Engine)이 메모리에 올라온 바이트코드를 읽으면서 기계어로 바꾸며 CPU에 실행시킨다.(JIT)

- 즉, 클래스 로더가 바이트코드를 메모리에 올리면 실행 엔진이 기계어로 바꾸며 인스턴스화 한다.

 

 

참고 : https://jh-labs.tistory.com/26

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함