공부노트/Java
[ Java ] 자바 가상 머신(JVM) 메모리 구조
Reload0213
2022. 1. 5. 21:33
자바 프로그램 특징
프로그램이 실행되기 위해서는 운영체제(OS)에게 시스템 리소스의 일부인 메모리를 할당 받아야 한다. 때문에 보통 운영체제에 종속되어 실행된다.
Java 프로그램은 JVM(Java Virtual Machine)이라는 프로그램을 사용하여 운영체제에 종속되지 않고 중립적으로 실행될 수 있다.

위의 그림과 같이 일반 프로그램은 운영체제를 통하여 Hardward에 접근하기 때문에 OS에 종속적이다.
하지만 Java 프로그램은 JVM이라는 가상머신을 사용하여 운영체제에 접근하기 때문에 운영체제에 종속적이지 않다. Java의 중립적 클래스 설계를 올바르게 하여 만들어진 코드는 운영체제에 상관 없이 재사용이 가능하다. 이것을 가능하게 해주는 것이 JVM이다.
하지만 JVM이라는 중간 과정이 한번 추가되었기 때문에 운영체제가 직접적으로 프로그램을 실행시키는 방식에 비해서는 속도면에서 느리다는 단점이 있다. 요즘은 기술의 발달로 Hardware의 스펙이 상향평준화 되었기 때문에 Java의 단점이 희석되고 있다.
JVM(Java Virtual Machine)
- Java와 OS 사이에서 중계자 역할
- Java코드의 재사용성을 높여줌
- 메모리 관리 기능으로 가비지 컬렉션(Garbage Collection)이 있음
- 가비지 컬렉션에 대해서는 차후 다른 포스팅에서 설명할 예정

자바 프로그램이 실행되는 과정
- 자바 소스, 즉 코드를 작성한다.(*.java)
- Java Compiler를 통하여 소스파일을 컴파일 한다. (javac.exe 사용)
- 컴파일 된 코드는 Java Byte Code 즉, JVM이 실행할 수 있는 형태의 파일로 변환된다. (*.class)
- JVM은 컴파일이 완료된 *.class 파일을 Class Loader로 읽어들이면서 프로그램을 시작한다.
Class Loader
- JVM내로 클래스를 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈. Runtime시에 동적으로 클래스를 로드함
Execution Exgine
- 클래스 로더가 JVM 내의 런타임 데이터 영역에 바이트 코드를 배치시키고, 이것은 실행 엔진에 의해 실행된다.
- 실행 엔진은 자바 바이트코드를 명령어 단위로 읽어서 실행한다.
Runtime Data Areas @ 중요 @
- JVM이 운영체제 위에서 실행되면서 할당받는 메모리 영역이다. 여러가지 세부 항목으로 나뉘어 지지만, 보통은 크게 3가지로 분류된다.
메소드 영역(Method Area)
- 메소드 영역은 모든 스레드가 공유하는 영역으로 JVM이 시작될 때 생성된다.
- 프로그램 실행 중 어떤 클래스가 사용되면, JVM은 해당 클래스의 *.class를 읽어서 분석하고, 그 정보를 저장한다.
- JVM이 읽어들인 각각의 클래스와 인터페이스에 대한 런타임 상수 풀, 필드, 메서드 정보, static변수, 메서드의 바이트코드 등을 보관한다.
힙 영역(Heap)
- 객체(인스턴스)가 생성되는 공간. 프로그램 실행 중 생성되는 모든 객체는 이곳에 생성된다. (동적)
- 가비지 컬렉션의 대상이 된다.
호출 스택 영역(Call Stack)
- 메서드의 작업에 필요한 메모리 공간을 제공한다.
- 메서드가 호출되면 스택(Stack) 방식으로 이곳에 메모리가 할당된다.
- 메서드가 작업을 수행하는 동안 지역변수, 매개변수, 연산의 중간 결과 따위가 저장된다.
- 메서드가 작업을 마치면(종료되면) 할당되었던 메모리 공간은 반환되어 비워진다.
- 호출 스택의 최상단에 위치하는 메서드가 현재 실행 중인 메서드이며, 나머지는 대기상태로 있게 된다.