IT_Note


자바가상머신(JVM) 이란?


자바 가상 머신(영어: Java Virtual Machine, JVM)은 자바 바이트코드를 실행할 수 있는 주체이다. 일반적으로 인터프리터나 JIT 컴파일 방식으로 다른 컴퓨터 위에서 바이트코드를 실행할 수 있도록 구현되나 자바 프로세서처럼 하드웨어와 소프트웨어를 혼합해 구현하는 경우도 있다. (이론적으로는 100% 하드웨어 구현도 가능하나 비효율적이다) 자바 바이트코드는 플랫폼에 독립적이며 모든 자바 가상 머신은 자바 가상 머신 규격에 정의된 대로 자바 바이트코드를 실행한다. 따라서 표준 자바 API까지 동일한 동작을 하도록 구현한 상태에서는 이론적으로 모든 자바 프로그램은 CPU나 운영 체제의 종류와 무관하게 동일하게 동작할 것을 보장한다. 


현재 사용되고있는 자바 가상머신 규격은 크게 네가지로 나뉜다. 

자바 SE, 자바 EE, 자바 ME, 자바 카드..


모든 자바 플랫폼의 기본이되는 것이 SE이며,

EE는 SE와 비슷하나 기업 서버 환경에서 사용될 목적으로 제정된 플랫폼으로 자바 SE에 추가 API가 더 정의된 형태이다.

우선은 이러한 규격들이 있다는 것만 안고 넘어가자..!


단, 규격이 동일하다고 해서 모두 같은 구현을 사용하지는 않는다. 

일례로 자바 SE와 자바 EE, 자바 ME의 CDC(Connected Device Configuration)는 동일한 규격을 사용하고 있으나 함께 정의된 표준 API에서 차이가 있고 사용 환경 자체의 특성에 맞게 만들어진 별도의 구현이 존재한다.


다음은 SE7 에디션에 기반을 둔 JVM아키텍처의 개요도 이다.



JVM메모리에는 

1.메소드(Static)영역 2.힙영역 3.스택영역 4.PC레지스터 5.네이티브 메소드 스택이 있다.

1.메소드(스태틱)영역

- JVM이 읽어들인 클래스와 인터페이스에 대한 런타임 상수 풀, 멤버변수(필드), 클래스변수 (Static변수) 그리고 생성자와 메소드를 저장하는 공간이다.

JVM 시작시 생성되며 프로그램 종료시까지 유지. 

가비지컬렉션의 대상

모든스레드에서 공유한다.

2.힙 영역

JVM이 관리하는 프로그램 상에서 데이터를 저장하기 위해 런타임 시 동적으로 할당하여 사용하는 영역이다.

New 연산자로 생성된 객체 또는 객체(인스턴스)와 배열을 저장한다.

힙 영역에 생성된 객체와 배열은 스택 영역의 변수나 다른 객체의 필드에서 참조한다.

참조하는 변수나 필드가 없다면 의미 없는 객체가 되어 GC의 대상이 된다.

힙 영역의 사용기간 및 스레드 공유 범위

객체가 더 이상 사용되지 않거나 명시적으로 null 선언 시

GC(Garbage Collection) 대상

구성 방식이나 GC 방법은 JVM 벤더마다 다를 수 있다.

모든 스레드에서 공유한다.

3. 스택영역

각 스레드마다 하나씩 존재하며, 스레드가 시작될 때 할당된다.

메소드를 호출할 때마다 프레임(Frame)을 추가(push)하고 메소드가 종료되면 해당 프레임을 제거(pop)하는 동작을 수행한다.

선입후출(FILO, First In Last Out) 구조로 push와 pop 기능 사용

메소드 호출 시 생성되는 스레드 수행정보를 기록하는 Frame을 저장

메소드 정보, 지역변수, 매개변수, 연산 중 발생하는 임시 데이터 저장

기본(원시)타입 변수는 스택 영역에 직접 값을 가진다.

참조타임 변수는 힙 영역이나 메소드 영역의 객체 주소를 가진다.

4.PC레지스터

현재 수행 중인 JVM 명령 주소를 갖는다.

프로그램 실행은 CPU에서 인스트럭션(Instruction)을 수행.

CPU는 인스트럭션을 수행하는 동안 필요한 정보를 CPU 내 기억장치인 레지스터에 저장한다.

연산 결곽값을 메모리에 전달하기 전 저장하는 CPU 내의 기억장치

5. Native Method Stack Area

자바 외 언어로 작성된 네이티브 코드를 위한 Stack이다.

즉, JNI(Java Native Interface)를 통해 호출되는 C/C++ 등의 코드를 수행하기 위한 스택이다.

네이티브 메소드의 매개변수, 지역변수 등을 바이트 코드로 저장한다.


참조 : 

https://ko.wikipedia.org/

http://stophyun.tistory.com/37

http://www.gliderwiki.org/wiki/76

http://linuxism.tistory.com/2

'JAVA > 이론' 카테고리의 다른 글

JAVA란  (0) 2017.04.11

JAVA란

JAVA/이론2017. 4. 11. 05:14


JAVA 란?

자바는 객체지향 프로그래밍 언어이다. 또한 컴퓨터 프로그래밍의 패러다임의 하나이다.

객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다. 객체 지향 프로그래밍은 프로그램을 유연하고 변경이 용이하게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용된다. 또한 프로그래밍을 더 배우기 쉽게 하고 소프트웨어 개발과 보수를 간편하게 하며, 보다 직관적인 코드 분석을 가능하게 하는 장점을 갖고 있다. 그러나 지나친 프로그램의 객체화 경향은 실제 세계의 모습을 그대로 반영하지 못한다는 비판을 받기도 한다.


특징

- 컴퓨터 아키텍처에 관계 없이 모든 자바 가상머신(jvm)에서 실행할 수 있다. 즉, 플랫폼 독립적이다.

자바프로그램은 자바컴파일러를 이용하여 자바 바이트코드로 컴파일되고, 이 자바 바이트 코드는 자바 가상머신에 의해 해석되어 실행된다. 이때 자바 가상머신은 자바 바이트코드에 대한 해석기 인터프리터로 동작되며 컴파일 방식 및 인터프리터 방식이 모두 적용된다. 

-또한 자바에는 가비지컬렉션이 있어 메모리 관리를 가상머신이 자동으로 수행한다.



- 자바 컴파일러란 ?

자바 컴파일러는 자바 프로그램을 중간 언어 형태(intermediate language) 인 자바 바이트 코드로 컴파일한다.

- 자바 바이트 코드란 ?

자바 바이트 코드는 플랫폼에 상관없이 자바 가상머신에 의해 실행될 수 있도록 정의된 중간코드이다.

- 자바 가상머신이란?

자바 바이트코드를 실행할 수 있는 주체이다. 자바 바이트 코드로 컴파일 된 자바 프로그램을 실행시키기 위해서 자바 가상머신을 이용한다.

- 자바 인터프리터란?

자바 인터프리터는 자바 바이트코드를 실행시켜주기 위한 기능을 명세하고있는 자바 가상머신을 구현해 놓은 것으로 자바 가상머신과 같은 의미로 사용되어짐.


요약

운영체제에 독립적이다. 한번 만들어진 실행 파일은 자바 가상 머신이 설치된 곳이라면 어느 곳에서든지 바로 실행할 수 있다.

겍체 지향 언어이면서 배우기 쉽고 간결한 문법을 가지고 있다.

포인터(pointer)를 다룰 필요 없이 메모리 관리를 가상 머신이 자동으로 수행한다.

네트워크, 분산 처리, 멀티 쓰레딩을 지원한다.

최근에는 성능도 많이 개선되어 c/c++로 작성된 프로그램에 비해서도 그 실행 속도가 뒤지지 않는다.

'JAVA > 이론' 카테고리의 다른 글

자바가상머신(jvm)과 메모리 구조  (0) 2017.04.11