JVM은 자바 바이트코드를 실행할 수 있는 주체이다.
자바와 다른 언어의 가장 큰 차이점은 컴파일된 코드가 플랫폼 독립적이라는 점이다. 여기저기서 다 쓸수있다는 것.
자바 컴파일러는 자바 언어로 작성된 프로그램을 바이트코드라는 특수한 바이너리 형태로 변환한다. 이 바이트코드를 실행하기 위해서는 특수한 가망 머신이 필요한데, JVM이 이 역할을 한다. 이때 JVM이 바이트코드를 어느 플랫폼에서나 동일한 형태로 실핸시키는 것이다.
왜 JVM이 필요한지 잠깐 잔바의 탄생 배경을 통해 알아보자.
처음에 자바는 냉장고, 전자레인지 등의 가전제품 제어에 사용할 목적으로 개발 되었었다. 여러가지 가전제품에서 모두 수행되는 언어를 만드는 것이 목적이었던 것이다. 그러나 가전제품 회사들의 무관심으로 주목을 받지 못하다가 1995년에 인터넷이 보급되면서 주목을 받게 되었다. (좀더 자세한 자바의 탄생 배경과 철학은 구글링해보기 바람)
위의 자바의 탄생 배경에서처럼 모든 플랫폼에서 코드를 실행하기 위한게 JVM이다. JVM이 인터프리터가 되어 코드 해석 방식의 실행을 함으로써 같은 바이트코드를 가지고 이기종 플랫폼에서 실행이 가능해지는 것이다.
이제 본격적으로 JVM의 구조에 대해서 알아보자.
참고로 기본적인 내용에 대해서만 기술하였다.
(자세히 파려면 책 한권 분량이 될것 같기 때문이다.는 훼이크고 사실 나의 무지함과 귀찮음의 콜라보 때문임)
JVM
java Compiler
Java 코드를 바이트코드로 변환
class loader
JVM으로 클래스를 로드. 컴파일된 자바 클래스 파일을 Runtime Data Area에 적재한다.
Execution Exgine
바이트코드를 실행 가능하도록 해석
Runtime Data Areas
JVM이 프로그램을 수행하기 위해서 할당받는 메모리 영역. Runtime Data Areas는 아래 5개의 구조로 이루어져있다.
Runtime Data Areas
1) Method Area
- JVM이 시작될 때 생성
- JVM이 읽어들인 클래스와 인터페이스에 대한 런타임 상수 풀, 필드, 메서드 정보, static변수, 메서드의 바이트코드 등을 보관한다.
2) Heap Area
- 객체가 생성될때 동적으로 할당받는 공간. 프로그램 수행중 생성되는 모든 객체, 배열들이 생성되는 공간이다.
- 가비지 컬렉션의 대상이 됨
3) PC Register
- 현재 수행중인 JVM의 주소 보관
4) Stack Area
- 메서드의 작업에 필요한 메모리 공간을 제공
- 메서드가 작업을 수행하는 동안 지역변수, 매개변수, 연산 시 발생 데이터가 저장된다.
- 메서드가 종료되면 할당되었던 메모리 공간은 반환된다.
- 선입후출(FILO) 구조(push, pop). 호출 스택의 최상단에 위치하는 메서드가 현재 실행 중인 메서드이다.
5) Native Method Stack Area
- 자바 외 언어로 작성된 네이티브 코드를 위한 공간
- JNI(Java Native Interface)를 통해 호출하는 C/C++ 등의 코드를 수행한다.
'개발' 카테고리의 다른 글
브라우저 렌더링 : reflow & repaint (0) | 2016.04.23 |
---|---|
String에 대한 궁금증 4가지 (0) | 2016.04.21 |
System.out.println에 관한 고찰 (8) | 2016.04.03 |
Cloud9 사용하기 (ci9) (2) | 2016.04.01 |
자바 for문을 이용하여 Map, Hash 값 꺼내기 (2) | 2016.03.28 |