자바 프로그램은 기계어와 자바 코드의 중간인 바이트 코드로 이루어져 있다.
이 바이트 코드를 해석해서 실행할 수 있는 가상의 운영체제가 JVM이다.
JVM은 실제 운영체제와 바이트 코드로 이루어진 자바 프로그램 사이에서 중계 역할을 한다.
자바 프로그램의 바이트 코드는 모든 JVM에서 동일한 실행 결과를 보장한다.
JVM 자체는 운영체제에 종속적이다.
자바 코드(*.java)는 컴파일러(javac.exe)에 의해 바이트 코드 파일(*.class)파일로 컴파일된다.
이 바이트 코드 파일은 JVM 구동 명령어(java.exe)에 의해 JVM에서 해석되고 해당 운영체제에 맞게 기계어로 번역되어 실행된다. 이때, main() 메소드를 찾아 실행시킨다.
java.exe로 JVM이 시작되면, JVM은 운영체제에서 할당받은 메모리 영역(Runtime Data Area)을 다음과 같이 세부 영역으로 구분해서 사용한다.
클래스와 관련된 데이터들을 저장하는 영역.
코드에서 사용되는 클래스(*.class)들을 클래스 로더로 읽어 클래스별로
등을 분류해서 저장한다.
메소드 영역은 JVM이 시작할 때 생성되고, 모든 스레드가 공유하는 영역이다.
객체와 배열이 생성되는 영역.
스택 영역의 참조 변수에서 참조된다.
참조되고있지 않다면 의미없는 객체가 되기 때문에 JVM은 GC를 실행시켜 이를 힙 영역에서 제거한다.
각 스레드마다 하나씩 존재하며, 스레드가 시작될 때 할당된다.
메소드를 호출할 때 마다 프레임을 스택에 추가하고,
메소드가 종료되면 해당 프레임을 스택에서 제거한다.
프레임 내부에는 로컬 변수가 스택 형태로 추가되거나 제거된다.
로컬 변수가 프레임 내부에 push되는 시점은 초기화가 될 때,
즉 최초로 변수에 값이 저장될 때이다.
변수는 선언된 메소드의 블록 안에서만 스택에 존재하고,
블록을 벗어나면 스택에서 제거된다.
참조 : 책 '이것이 자바다'