JVM
JVM이란 자바 버츄어 머신을 줄인말로 자바를 실행하기 위한 가상머신이다.

일반 애플리케이션은 OS만 거치고 하드웨어로 바로 전달되는데에 비해
자바애플리케이션은 JVM을 한번 더 거치기 때문에 그리고 하드웨어에 맞게 완전히 컴파일된 상태가 아니고 실행시에 해석되기 때문에 속도가 느리다는 단점을 가지고 있다.
자바 실행 순서

소스코드단계
- 개발자는 .java 확장자를 가진 파일에 자바 소스코드를 작성한다
컴파일단계
- 어플리케이션이 실행되면 JVM이 OS로부터 메모리를 할당받는다.
- 자바 컴파일러(javac.exe)가 자바소스코드(.java)를 읽어 바이트코드(.class)로 변환
- 바이트코드란 jvm이 알아들을 수 있는 명령어 집합이다.
- 문법검사 더이상안함으로서 시간단축, 하지만 매번 컴파일하고 실행시켜야해서 시간이소요되는단점이 있다
클래스 로딩 단계
- Class Loader .를 통해 바이트코드를 JVM으로 로딩
- 클래스 로더는 런타임데이터 에어리어라는 JVM이사용하는 가상 공간인데, 이곳으로 보낸다
- 로딩된 바이트코드는 Excution Engine을 통해 해석됨.
- Excution Engine - Runtime Data Area에 할당된 바이트 코드를 실행시키는 주체.
코드를 실행하는 방식은 두가지다.
| 1. Interpreter 인터프리터
-바이트 코드를 해석하여 실행하는 역할을 수행
-다만 같은 메소드라도 여러번 호출될 때 매번 새로 수행해야 한다.
-
JIT Compiler 프로그램의 실행속도를 향상시키기 위해 사용된다. 자주 사용되는 바이트코드부분을 캐싱하여 기계어로 변환하는방식 . 다시 실행할때 빠르게 실행된다 |
---|
- 해석된 바이트코드는 Runtime Data Areas에 배치되어 실행됨.
- 이곳이 실질적인 데이터를 할당받아 실행하는 영역으로 보면 된다.
- 실행되는 과정에서 garbage collector(GC)같은 작업이 수행된다
- RUN TIME DATA AREA는 다섯가지영역으로 나누어져있다.

RUNTIME DATA AREA
Method Area
-
클래스에 대한 모든 정보가 저장되는 곳 (클래스의 구조, 필드, 메서드, 생성자,인터페이스)
클래스의 메서드와 생성자, 인터페이스 메서드에 대한 바이트코드가 여기에 저장된다.
-
정적변수가(static)이 영역에 저장된다.
-
문자열 상수와 타입 필드 메서드의 이름이 이곳에 저장된다.
-
모든 스레드가 공유된다. (자바는 기본적으로 하나의 스레드 (main)가 있지만 멀티스레딩도 가능)
Heap
- 동적으로 할당된 메모리 영역 , new로 생성된 객체와 배열들이 이곳에 할당된다.
- 모든 Object 타입의 데이터가 할당이 된다.
- 가비지컬렉션이 존재한다.
- 메모리 크기는 jvm이 시작될때 정해지고 조정이 가능하다.
- 모든 스레드가 공유된다.
Stack Area
-
지역변수나 메서드의 매개변수, 임시적으로 사용되는 변수, 메서드의 정보가 저장되는곳.
지역변수와 매개변수 특성상 호출이 종료되면 이 영역은 사라진다.
Pc register
- 컴퓨터를 이야기하는것이 아님.
- 쓰레드가 시작될때 생성되며 현재 수행중인 jvm의 명령어 주소를 저장하는 공간이다.
native method stack
- 자바가 아닌 다른 언어로 작성된 코드를 위한 공간이다.
Person p = new Person();은 어디에 저장될까 ?
p는 stack에 생성된다. 하지만 new Person은 heap 영역에 생성된다.
이 문제는 참조 by reference 와 참조 by value문제에서 다시 다루겠다.