자바가상머신(jvm)과 메모리 구조
자바가상머신(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