시스템 메모리를 관리하면서 자바 기반 애플리케이션을 위해 이식가능한 실행 환경을 제공한다.
JVM은 다른 프로그램을 실행시키는 것이 목적인 프로그램
방어적 코딩의 훌륭한 예
1.1 JVM의 기본 기능
OS에 종속받지 않고 CPU 가 Java를 인식, 실행할 수 있게 하는 가상 컴퓨터.
자바 프로그램이 어떤 기기, 운영체제에서도 실행될 수 있게 하는 것 “한 번 작성해, 어디서나 실행한다”
프로그램 메모리를 관리하고 최적화 하는 것
1.2 JVM에서의 메모리 관리
JVM 실행에 있어 가장 일반적인 상호작용은 힙(Heap)과 스택(Stack)의 메모리사용을 확인하는 것이다.
가장 흔한 교정작업은 JVM의 메모리 설정 값들을 조율하는 것
1.3 가비지 컬렉션(Garbage Collection)
가비지 컬렉션은 자바 프로그램에서 사용되지 않는 메모리를 지속적으로 찾아내서 제거한다.
가비지 컬렉션은 실행 중인 JVM 내부에서 일어난다.
2. JVM의 3가지 측면
2.1 JVM 사양, Specification
JVM은 소프트웨어 사양이다.
JVM 사양은 구현에 있어 최대한 창조성을 허용하기 위해 JVM 구현 세부사항이 사양안에 정의되어 있지 않다.
“자바 가상 머신을 올바르게 구현하려면, 클래스(Class) 파일 포맷을 읽고 그 안에 지정된 작업을 제대로 수행하기만 하면 된다.”
JVM이 해야만 하는 일은 자바 프로그램을 정확하게 실행하는것 뿐
2.2 JVM 구현, Implementation
오라클의 라이선스가 부여된 JDK를 포함해 거의 모든 Open JDK와 핫스팟 JVM의 Fork로 생성된 것
일반적으로 JRE(Java Runtime Environment) 번들의 한 부분으로 JVM을 다운로드해 설치한다.
2.3 JVM 인스턴스, Instance
JVM 스펙이 구현되어 소프트웨어 제품으로 릴리즈 되면, 개발자는 그것을 하나의 프로그램처럼 다운로드해 실행할 수 있다.
이렇게 다운로드 된 프로그램이 하나의 JVM 인스턴스이다.
개발자들이 JVM에 대해 말하는 경우 대부분은 소프트웨어 개발 환경 또는 제품화 환경에서 실행되는 하나의 JVM 인스턴스를 지칭한다.
3. JVM 구성요소
3.1 클래스 로더
JVM내로 클래스파일(.class)을 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈
클래스를 처음 참조할 때, 해당 클래스를 로드하고 링크하는 역할
3.2 실행 엔진
클래스 로더가 JVM내의 런타임 데이터 영역에 바이트 코드를 배치시키고 실행 엔진에 의해 실행된다.
인터프리터
실행 엔진은 자바 바이트 코드를 명령어 단위로 읽어서 실행한다.
JIT
가비지 컬렉터
더이상 사용되지 않는 인스턴스를 찾아 메모리에서 삭제한다.
3.3 런타임 데이터 영역
3.4 PC Register
Thread가 시작될 때 생성되며 생성될 때마다 생성되는 공간으로, Thread마다 하나씩 존재
Thread가 어떤 부분을 어떤 명령으로 실행해야할 지에 대한 기록을 하는 부분으로 현재 수행중인 JVM 명령의 주소를 갖는다.
- Thread : 프로세스 내에서 실제로 작업을 수행하는 주체를 의미
- 프로세스 내부에 있는 CPU 수행 단위
- 프로세스는 운영체제로부터 자원을 할당받는 작업의 단위, 쓰레드는 프로세스가 할당받은 자원을 이용하는 실행의 단위이고 프로세스 내에 여러개 생길 수 있다.
4. 메모리 구조
4.1 코드(Code) 영역
메모리의 코드영역은 실행할 프로그램의 코드가 저장되는 영역으로 텍스트 영역이라고도 부른다.
CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리하게 된다.
4.2 데이터(Data)영역
메모리의 데이터영역은 프로그램의 전역 변수와 정적(static) 변수가 저장되는 영역이다.
데이터 영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸한다.
4.3 스택(Stack) 영역
함수의 호출과 관계되는 지역변수나 매개변수, 임시 데이터, 스레드나 메소드의 정보를 저장한다.
스택 영역은 함수의 호출과 함께 할당되며 함수 호출이 완료되면 소멸한다.
스택 영역에 저장되는 함수의 호출 정보를 스택 프레임(stack frame)이라고 한다.
스택 영역은 푸시(push)동작으로 데이터를 저장하고, 팝(pop) 동작으로 데이터를 인출한다.(LIFO)
스택 영역은 메모리의 높은 주소에서 낮은 주소의 방향으로 할당된다.
Static 영역에 저장되는 데이터
Field Information - 멤버변수의 이름, 데이터 타입, 접근 제어자에 대한 정보
Method Information - 메소드의 이름, 리턴타입, 매개변수, 접근 제어자에 대한 정보
Type Information - class인지 interface인지의 여부 저장, Type 속성, super클래스의 전체이름
interface이거나 object인 경우 제외 → Heap
4.4 힙(Heap) 영역
메모리의 힙 영역은 사용자가 직접 관리할 수 있고 해야만 하는 메모리 영역.
힙 영역은 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다.
힙 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다.
new 연산자로 생성되는 객체와 배열을 저장
Class Area(Static Area)에 올라온 클래스들만 객체로 생성할 수 있다.
New / Young 영역
이곳의 인스턴스들은 추후 가비지 컬렉터에 의해 사라짐 (Minor GC)
Eden : 객체들이 최초로 생성되는 공간
Survivor 0, 1: Eden에서 참조되는 객체들이 저장되는 공간
Old 영역
이곳의 인스턴스들은 추후 가비지 컬렉터에 의해 사라짐 (Major GC), Minor에 비해 속도가 느림
5. JDK JRE
5.1 JDK
Java Development Kit
java를 사용하기 위해 필요한 모든 기능을 갖춘 Java용 SDK(Software Development Kit)