- JVM 자바가상머신
- 인터프리터(interpreter)
- 바이트를 한 줄씩 해석하고 실행하는 프로그램
- JVM은 바이트코드를 실시간 해석하여 진행
- JDK (Java Development Kit)
- 자바 개발 키트. 자바 애플리케이션 개발을 위한 도구 모음
- 컴파일러(javac), JVM, APL(라이브러리) 등 도구 포함
- JRE (Java Runtime Environment)
- 자바 실행 환경
- 자바 애플리케이션을 실행하려면 JRE만 설치. 자바 애플리케이션을 개발 시 JDK 필요
자바 프로그램이 실행 되는 가상 환경

- JVM 이해 코드
- static 정적
- 클래스 내부에 행위가 있을 때 작성 static 선언된 변수나 메서드는 객체를 생성하지 않고 클래스 이름으로 호출
- 클래스 실행 시 한 번만 메모리에 적용되고, 프로그램 종료 시 해제
- heap 동적
- static 아닌 것을 호출. new로 객체 생성 시 heap 공간에 생성
- statck 스택
- 메서드 호출 시 지역 변수와 호출 정보를 저장
- 자동 메모리 관리. 메서드 호출이 끝나면 저장한 메모리 자동 해지
- queue 큐
- 선입선출. 첫 번째 들어온 데이터가 첫 번째로 호출
JVM > 클래스 로드 > static 찾기 > static main 실행
public class JvmTest {
// 인스턴스 변수 num1 (Heap 저장)
int num1 = 1; // 객체 생성될 때 인스턴스 변수 num1 할당
// static 변수 num2 (Static 저장)
static int num2 = 2; // 클래스 로딩 시 한 번만 할당, 모든 객체 공유
// method1 메서드 (Stack 메모리 영역에서 호출 시 메모리 할당)
void method1(int num3){ // num3은 method1의 매개변수 (Stack 영역)
System.out.println("num3: "+num3); // 메서드에 매개변수 num3 출력
int num4 = 4; // num4는 method1의 지역 변수 (Stack 영역)
System.out.println("num4: "+num4); // 지역 변수 num4 출력
}
public static void main(String[] args) {
// main메서드 실행 시 Stack 메모리 영역에 할당
System.out.println("JVM Start");
// 클래스 이름으로 static 변수 접근 (static 영역에 num2 접근)
System.out.println("num2: "+JvmTest.num2); // num2는 static 변수로 클래스 레벨에 공유
// JvmTest 객체를 생성 (Heap 메모리에서 객체가 생성됨)
JvmTest jt = new JvmTest(); // new JvmTest()는 Heap 메모리에 객체 생성
System.out.println("num1: "+jt.num1); // num1은 객체마다 개별 존재하는 인스턴스 변수
// method1을 호출하고, 매개변수 num3에 값3 넘김
jt.method1(3); // method1 호출 시 num3는 Stack 메모리에 할당된 매개변수 전달
}
}
인스턴스 객체 수와 관계없이 하나만 존재
객체가 참조되지 않을 때, 메모리 해제
마지막 호출된 함수부터 종료
사진 출처: 이재환의 자바 프로그래밍 입문
Share article