Article Image
Article Image
read

JVM 상에서 프로그램이 동작하기 위해서는 OS로 부터 메모리를 할당 받아야 하는 데 이 영역을 보통 Runtime Data Area 라고 한다. Runtime Data Area 는 다음과 같이 구성이 되어 있다.

  1. Class
  2. Stack
  3. Heap
  4. Native Method Stack
  5. PC Register

하나씩 살펴보자.

Class

Class 코드에 대한 메타 정보들이 보관되어 있다. 다음의 정보들을 포함한다.

  1. Type Information : Type의 속성이 Class인지 Interface 인지 여부 저장
  2. Field Information : 멤버변수의 이름, 데이터 타입, 접근 제어자에 대한 정보
  3. Method Information : 메서드의 이름, 리턴타입, 매개변수, 접근 제어자에 대한 정보
  4. Constant Pool : Type에서 사용된 상수를 저장한다.
  5. Class Variable : Static 변수라고도 함. 모든 객체가 공유 가능, 객체 생성 없이 접근 가능
  6. static 이면서 final 인 변수 선언은 Constant pool에 값 복사
  7. Reference to Class : Type이 어떤 ClassLoader 를 경유해서 로딩되었는 지에 대한 정보

JVM 상에 어떤 프로그램이 동작하기 위해서는 Class Loading 의 절차가 이루어진다. .class 파일의 메타 정보를 Class 메모리 영역으로 적재(loading)되는 것이다. 클래스가 메모리에 적재되는 절차는 다음과 같다.

  1. 어떤 메소드를 호출하는 코드를 수행할 때, 그 메소드를 가진 클래스 바이트 코드가 없다면 jvm 은 JRE 라이브러리 디렉토리에서 해당 클래스를 찾는 다.
  2. 없으면 CLASSPATH 환경 변수에 지정된 위치해서 해당 클래스를 찾는다.
  3. 찾았으면 해당 클래스 파일이 유효한 바이트 코드인지 검사한다.
  4. 유효하다면 메소드 영역으로 해당 파일을 로딩한다.
  5. 클래스 변수가 선언 되었다면 메소드 영역에 해당 변수를 준비한다.
  6. 클래스 블록 별로 코드를 순차적으로 수행한다.
  7. 이렇게 클래스의 바이트 코드가 로딩 되면 jvm 이 종료될 때 까지 해당 내용을 유지한다.

Stack

  • 메소드 호출 시 해당 메소드를 위한 공간 생성 => 스택 프레임이라고 한다.
  • 메소드 안에서 사용되어지는 값들 저장. 호출된 매개변수, 지역변수, 리턴 값 및 연산 시 일어나는 값들을 스택 프레임에 임시 저장한다.
  • 메소드 수행이 끝나면 스택 프레임 별로 삭제

Heap

  • 인스턴스 저장
  • 클래스 영역에 로드된 클래스만 여기 저장
  • Garbage Collector 로 메모리 반환됨.
  • Permanent Generation(Java 1.8 이전) + New Area + Old Area 로 구성되어 있음.

Heap 영역은 아주 JVM 에서 아주 중요한 부분이므로 나중에 따로 한 챕터를 할애해서 상세히 설명하기로 한다.

Native Method Stack

  • Java 외의 다른 언어에서 제공되는 코드들이 저장되는 공간
  • JNI 에서 사용되는 System Call 도 이 곳에 저장된다.

PC Register

  • Thread가 생성될 때 마다 생성되는 공간
  • Thread가 어떤 부분을 어떤 명령으로 실행할 지에 대한 기록
  • 현재 실행되는 부분의 명령과 주소를 저장
Blog Logo

Joseph Yoon


Published

Image

엔지니어와 아티스트 사이

엔지니어와 아티스트 사이 예술과 공학 사이

Back to Overview