IT 개발노트

JVM의 메모리 구조 본문

기초튼튼

JVM의 메모리 구조

limsungju 2019. 1. 20. 18:43

1. 메모리
: 프로그램을 실행하기 위한 데이터 및 명령어를 저장하는 공간

1.1 프로그램의 실행구조
: 프로그램이 실행되기 위해서는 windows나 linux같은 운영체제(OS)가 제어하고 있는 시스템의 리소스의 일부인 메모리(RAM : 주기억장치)를 제어할 수 있어야 하는데, java이전의 c같은 대부분의 언어로 만들어진 프로그램은 이러한 이유 때문에 OS에 종속되어 실행되게 되어 있었다.

1.2 java 프로그램의 실행구조
: java 프로그램은 JVM(Java Virtual Machine : 자바가상머신)이라는 프로그램만 있으면 실행이 가능한데, JVM이 OS에게서 메모리 사용권한을 할당받고 JVM이 java 프로그램을 호출하여 실행하게 된다. OS에는 독립되었지만 JVM 프로그램에 종속적이게 된다.
* JVM을 실행시키고 다시 JVM이 프로그램을 실행시키는 방식이다 보니 OS에 직접 제어받는 방식보다는 속도면에서는 느리다는 단점을 가진다.


* JVM이란?
- Java Virtual Machine
- JAVA와 OS 사이에서 중계자 역할
- JAVA와 OS에 구애받지 않고 재사용을 가능하게 해줌
- 메모리 관리 기능(Garbage Collection)

2. java 프로그램의 실행 과정과 JVM 메모리 구조
: 프로그램이 실행되면, JVM은 OS로부터 이 프로그램이 필요로하는 메모리를 할당받고, JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.


- JAVA Source : 사용자가 작성한 JAVA 코드
- JAVA Compiler : JAVA 코드를 Byte Code로 변환시켜주는 기능
- Class Loader : Class파일을 메모리(Runtime Data Area)에 적재하는 기능
- Execution Engine : Byte Code를 실행 가능하게 해석해주는 기능
- Runtime Data Area : 프로그램을 수행하기 위해 OS에서 할당 받은 메모리                                공간

2.1 Runtime Data Area
2.1.1 Class Area


- Method Area, Code Area, Static Area로 불리어짐
- Field Information : 멤버변수의 이름, 데이터 타입, 접근 제어자에 대한 정보
- Method Information : 메서드의 이름, 리턴타입, 매개변수, 접근 제어자에                                    대한 정보
- Type Information : Type의 속성이 Class인지 Interface인지의 여부 저장
                           Tpye의 전체이름(패키지명 + 클래스명)
                           Tpye의 Super Class의 전체이름
                           (단, Tpye이 Interface이거나 Object Class인 경우 제외)
                           접근 제어자 및 연관된 Interface의 전체 리스트 저장
- 상수 풀(Constant Pool) : Tpye에서 사용된 상수를 저장하는 곳(중복이 있을
                                  시 기존의 상수 사용)
                               문자 상수, 타입, 필드, Method의 sym bolic reference
                                  (객체 이름으로 참조하는 것)도 상수 풀에 저장
- Class Variable : Static 변수라고도 불림
                      모든 객체가 공유 할 수 있고, 객체 생성 없이 접근 가능
- Class 사용 이전에 메모리 할당 : final class 변수의 이전(상수로 치환되어)
                                           상수 풀에 값 복사

2.1.2 Call Stack Area


- Last In First Out (LIFO)
- 메서드 호출 시마다 각각의 스택프레임(그 메서드만을 위한 공간)이 생성
- 메서드 안에서 사용되어지는 값들 저장, 호출된 메서드의 매개변수, 지역변수, 리턴 값 및 연산 시 일어나는 값들을 임시저장
- 메서드 수행이 끝나면 프레임별로 삭제

2.1.3 Heap Area


- new 연산자로 생성된 객체와 배열을 저장하는 공간
- 클래스 영역에 로드된 클래스만 생성가능
- Garbage Collector를 통해 메모리 반환
- Permanent Generation : 생성된 객체들의 정보의 주소값이 저장된 공간
- New Area
  Eden : 객체들이 최초로 생성되는 공간
  Survivor : Eden에서 참조되는 객체들이 저장되는 공간
- Old Area : New에서 일정시간이상 참조되고 있는 객체들이 저장되는 공간

2.1.4 Method Area
: 프로그램 실행 중 어떤 클래스가 사용되면, JVM은 해당 클래스의 클래스파일(*.class)을 읽어서 분석하여 클래스에 대한 정보(클래스 데이터)를 이곳에 저장한다. 이때, 그 클래스의 클래스변수도 이 영역에 함께 생성된다.