JVM(Java virtual machine)은 자바 가상 머신으로 자바 바이트 코드를 해석하는 역할을 한다. JVM만 있다면 플랫폼에 영향을 받지 않으므로 Window, Linux 등 다양한 환경에서 사용이 가능하다.
아래 세 가지 실행 단계를 거쳐 자바 소스코드가 OS에서 실행된다.
JVM 런타임 데이터 영역에는 클래스(class) 영역, 힙(heap) 영역, 스택(stack) 영역이 있다. 이 세가지 메모리 영역의 주요 특징과 사용 방식에 대해 알아보자.
Static, Method 영역이라고도 불리며, 클래스 정보, static 변수, 변수 정보(데이터타입, 접근제어자), 메소드 정보(메소드명, 리턴타입, 파라미터, 접근제어자), final class, constant pool 등이 저장되는 메모리 영역이다. JVM이 동작해서 클래스가 로딩될 때 생성되며, JVM이 종료될 때까지 유지된다. 또한 런타임 중에 변경할 수 없는 특징을 가지고 있고 고정된 공간을 차지하고 있다. 해당 메모리를 잘 사용하는 경우(Singleton 패턴) 메모리 사용에서 이점을 볼 수 있으나, static 변수와 같이 공유되는 자원의 경우 잘못 사용하면 멀티 쓰레드 환경에서 치명적인 버그를 불러올 수 있다.
힙 영역에는 new 키워드로 생성된 객체(인스턴스)의 데이터와 참조 자료형(class, interface, enum, Array 등)이 저장된다. 클래스 영역에 로드된 클래스로만 객체 생성이 가능하며 garbage collector의 주요 대상이 된다. 인스턴스가 생성될 때 힙에 생성되며, 가비지 컬렉터가 메모리를 수거할 때 소멸한다.
스택 영영에는 int, boolean 등 기본 자료형과 지역 변수, 파라미터, 리턴값 등 연산에 임시로 사용되는 정보들이 저장된다. 또한, 객체의 참조 주소값도 스택 영역에 저장된다. 메소드 호출 시 개별적으로 스택이 생성되며, 종료 시 소멸한다.