Java - JVM
자바가상머신 , JVM(Java Virtual Machine)이란 ??
JVM은 자바 애플리케이션을 클래스 로더를 통해 읽어 들여 자바 API와 함께 실행하는 것이다.
JVM은 JAVA와 OS사이의 중개자 역할을 하여 , JAVA가 OS에 의존하지않고 실행될수 있게 한다.(플랫폼에독립적)
그리고 JVM은 메모리관리, Garbage Collection을 수행한다.
JVM 은 스택 기반의 가상머신이다. (ARM 등은 레지스터기반으로 동작하는데에 반해)
자바 프로그램 실행 과정
- 프로그램이 실행되면 JVM은 OS로 부터 이 프로그램이 필요로 하는 메모리를 할당 받는다. JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.
- 자바 컴파일러(javac)가 자바소스(.java)를 읽어들여 자바 바이트코드(.class)로 변환시킨다.
- Class Loader를 통해 class 파일들을 JVM으로 로딩한다.
- 로딩된 class파일들은 Excution engin을 통해 해석된다.
- 해석된 바이트코드는 Runtime Data Areas에 배치되어 실질적인 수행이 이루어지게 된다.
- 이러한 실행과정속에서 JVM은 필요에따라 Thread Synchronization과 GC같은 관리작업을 수행한다
JVM 구성
Class Loader(클래스로더)
- JVM내로 클래스(.class)파일을 로드하고, 링크를통해 배치하는 작업을 수행한다.
- Runtime시에 동적으로 클래스를 로드
- jar파일 내 저장된 클래스들을 JVM위에 탑재하고 사용하지 않는 클래스들을 메모리에서 삭제한다
- 자바는 동적코드, 컴파일 타임이아니라 런타임에 참조한다.
- 즉, 클래스를 처음으로 참조할 때, 해당클래스를 로드하고 링크한다는 뜻
Execution Engine(실행엔진)
- 클래스를 실행시키는 역할을함
- 클래스 로더가 JVM내의 런타임 데이터 영역에 바이트코드를 배치
- 자바 바이트 코드를 실행
- 자바 바이트코드란 기계가 바로 실행할수 있는 언어보다는 비교적 인간이 보기 편한 형태로 기술된형태
- 실행엔진이 한번더 JVM내부에서 인식할 수 있는 형태로 변환한다.
- Interpreter
- 자바 바이트코드를 명령어 단위로 읽어서 실행한다.
- 한줄한줄실행됨
- JIT(Just In Time)
- 인터프리터 방식의 단점을 보완하기 위해 도입된 방법
- 인터프리터 방식으로 실행하다가, 적절한 시점에 바이트코드 전체를 컴파일하여 네이티브코드로 변경하고 그 이후에는 네이티브 코드를 직접 실행
- 네이티브 코드를 캐시에 보관하게되어 , 인터프리터 방식보다 빠르게실행됨
- 한번만 실행되는 코드라면 인터프리터 하는게 더 유리하다.
- JIT 컴파일러는 JVM내부적으로 해당 메소드가 얼마나 자주 수행되는지 체크하고, 일정 정도가 넘을때에만 컴파일을 수행한다.
- Garbage collector
- GC를 수행하는 모듈(스레드)
Runtime Data Area(실행엔진)
프로그램을 수행하기 위해 OS에서 할당받은 메모리 공간
- PC Register
- Thead가 시작될 때 생성되며, 생성될때마다 생성되는 공간으로 스레드마다 하나씩 존재
- Thread가 어떤 부분을 어떤 명령으로 실행해야 할 지에 대한 기록을 하는 부분
- 현재 수행중인 JVM 명령의 주소를 갖는다
- JVM STACK
- 프로그램 실행과정에서 임시로 할당되었다가 메소드를 빠져나가면 바로 소멸되는 특성을 저장하기 위한 영역
- 각종 형태의 변수나 임시 데이터, 스레드나 메소드의 정보를 저장
- 기본형타입의 변수나, 참조형타입의 인스턴트의 참조를 저장
- 메소드 호출시 그 스택 프레임이 생겨 프레임을 벗어나면 바로 소멸
- Native method stack
- 자바 프로그램이 컴파일되어 생성되는 바이트 코드가 아닌 실제 생성할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역
- JAVA가 아닌 다른 언어로 작성된 코드를 위한 공간
- JAVA Native Interface를 통해 바이트코드로 전환하여 저장하게됨
- Method Area ( == Class Area == Static Area)
- 클래스정보를 처음 메모리공간에 할당할때 , 초기화대는 대상을 저장하는 공간
- 프로그램의 흐름을 구성하는 바이트코드
- 사실상 컴파일된 바이트코드의 대부분이 이 메소드 바이트코드이기때문에 여기에 할당된다
- 이공간에는 Runtime Constant Poll이라는 별도의 관리영역도 존재한다
- 이는 상수형 자료형을 저장하여 참조하고 중복을 막는 역할을 한다.
- 올라가는 정보의 종류
- Field Information
- 멤버 변수의 이름, 데이터타입, 접근제어자에 대한 정보
- Method Information
- 메소드의 이름, 리턴타입 ,매개변수, 접근제어자에 대한 정보
- Type Information
- class인지 inferface인지의여부 저장 , Type의 속성, 전체이름, super class의 전체이름등
- Field Information
- 클래스정보를 처음 메모리공간에 할당할때 , 초기화대는 대상을 저장하는 공간
Method Area가 클래스 데이터를 위한 공간이라면 , Heap은 객체를 위한 공간 입니다.
Method Area도 Heap과 마찬가지로 GC의 관리대상에 포함된다.
- Heap
- 객체를 저장하는 가상 메모리 공간.
- new 로 생성된 객체와 배열등저장
- Method Area에 올라온 클래스들만 객체로 생성할 수 있다.
- Heap은 세 부분으로 나눌 수 있다.
- Permanent Generation
- 생성된 객체들의 정보의 주소값이 저장된 공간.
- class loader에 의해 load되는 Class , Method등에 대한 Meta정보가 저장되는 영역
- JVM에 의해 사용된다.
- Refelction을 사용하여 동적으로 클래스가 로딩되는 경우에 사용
- New/Yung 영역
- Eden : 객체들이 최초로 생성되는 공간
- Survivor 0/1 : Eden이 꽉차면 옮겨지는 공간
- Old 영역
- New area에서 일정시간 참조되고, 살아남은 객체들이 저장되는 공간
'JAVA' 카테고리의 다른 글
Java - Atomic변수 (0) | 2019.09.02 |
---|---|
Java - Garbage Collection (0) | 2019.09.02 |
Java - 메모리관리 ( 스택& 힙) [펌] (0) | 2019.09.01 |
Primitive vs Reference (0) | 2019.09.01 |
Java Stream 결과 만들기 (0) | 2019.09.01 |
댓글