본문 바로가기
CS/JAVA

[JAVA] JVM 구조와 메모리

728x90

 

 

 


 JVM이란?

 

Java 프로그램은 완전한 기계어가 아닌 중간 단계의 바이트 코드이기 때문에 운영체제는 이를 해석하고 실행할 수 없다. 따라서 운영체제는 해당 OS에 맞는 JVM(Java Virtual Machine)을 설치해야 하고 Java 프로그램은 JVM 위에서 구동된다. 바이트 코드는 모든 JVM에서 동일한 실행 결과를 보이기 때문에 Java는 운영체제와 플랫폼에 독립적인 언어로 널리 사용되고 있다. 

 

 

 


 JVM 구조

 

 

Class Loader
런타임 시 .class 파일인 Java 바이트 코드를 읽어 들여 JVM의 메모리 영역(Runtime Data Area)에 적재한다. 처음 클래스에 접근할 때 동적으로 로드하고 인스턴스 생성 시 Class Loader를 통해 메모리에 로드한다. 

Execution Engine

Runtime Data Area에 적재된 클래스들의 바이트 코드들을 명령어 단위로 실행한다. 

Garbage Collector
Runtime Data Area의 Heap 영역에 생성된 인스턴스들 중 더 이상 참조되지 않는 인스턴스를 정리한다. GC가 정확히 언제 역할을 수행하는지는 알 수 없으며 GC가 수행될 때 이를 제외한 모든 스레드는 일시정지된다. 

Runtime Data Area
Java 프로그램 실행 시 JVM에 할당되는 메모리 영역으로, 사용되는 데이터들을 적재하는 영역이다. 총 5개의 영역 Method Area, Heap Area, Stack Area, PC Register, Nagive Method Stack으로 나뉜다.

 

 

 


 JVM 메모리(Runtime Data Area)

 

 

Method Area    
Class Area 또는 Static Area라고도 불리며 클래스와 인터페이스 정보가 저장되는 영역이다. 모든 스레드들이 공유하는 영역이며 필드, 생성자, 메소드, static 변수 등에 대한 정보가 담겨있다. 

Heap Area
New 연산자로 생성한 인스턴스와 배열이 런타임 시 동적으로 할당되는 영역이다. 모든 스레드들이 공유하는 영역이며 각 스레드들은 스택 영역의 참조 변수를 통해 객체에 접근한다. 객체의 위치는 우리가 알 수 없다. 또한 힙 영역은 Eden과 Survivor로 이루어진 Young Generation과 Old, Permanent로 구성되어 있다. Permanent 영역은 JDK8부터 Metaspace 영역으로 변경되어 Native 영역으로 이동하였다. 

Stack Area
각 스레드마다 고유의 스택 영역이 존재하며 메소드 내에 정의된 지역변수(기본 자료형, 참조 자료형)의 데이터 값이 저장된다. 메소드가 호출될 때 할당되고 끝나면 메모리가 해제된다.

PC Register
각 스레드 별로 PC Register를 가지며 스레드가 실행되는 부분의 주소와 명령을 저장하는 영역이다.

Native Method Stack
네이티브 코드 즉, 바이트 코드가 아닌 바이너리 코드를 실행하는 영역이다. JNI(Java Native Interface)를 통해 호출되는 C/C++의 코드를 실행한다. 

 

 

 


📝 요약

◾ JVM은 크게 4가지 영역 Class Loader, Execution Engine, Garbage Collector, Runtime Data Area로 나뉜다.

◾ Runtime Data Area은 런타임 시 JVM에 할당되는 메모리 영역으로 크게 4가지 영역(JDK8 이상) Method Area, Heap Area, Stack Area, PC Register로 나뉜다.

◾ Heap Area와 Garbage Collector에 관한 포스트는 여기서 확인할 수 있다. (작성 예정)

 

 

 


📃 Ref

728x90
반응형

'CS > JAVA' 카테고리의 다른 글

[JAVA] 예외 클래스  (0) 2021.08.09
[JAVA] Wrapper 클래스  (0) 2021.07.25
[JAVA] 객체와 클래스, 그리고 인스턴스의 차이  (0) 2021.07.24