본문 바로가기
Programming Language/Java & Kotlin

[JAVA & Kotlin] Java 메모리 구조 (JVM Memory Structure)

by happy coding! 2022. 9. 14.
반응형

JVM

JVM(Java Virtual Machine)은 자바 가상 머신으로 자바 프로그램을 실행시키기 위해서 반드시 실행되어야 하는 소프트웨어 입니다.

자바 프로그램을 실행시키는 것은 JVM을 실행시키고 그 위에서 자바 프로그램을 실행시킨다는 의미입니다.
즉 JVM은 운영체제(OS)와 자바 프로그램 사이를 연결해주는 중계자 역할을 합니다.

자바 코드를 컴파일하여 .class 바이트 코드(.class 파일은 바이트 코드라고 하는데 사람이 쓰는 자바 코드에서 컴퓨터 읽는 기계어의 중간 단계라고 할 수 있습니다)로 만들면 이 코드가 자바 가상 머신 환경에서 실행됩니다.

이러한 특징으로 인해 자바 프로그램에서 오류가 발생해도 JVM만 다운될 뿐 전체 시스템에 데미지를 주지 않습니다. 또한

JVM 덕분에 플랫폼에 의존적이지 않게 자바 프로그램이 구동될 수 있습니다.

C언어의 경우

JAVA의 경우

JVM은 전반적인 메모리 관리도 같이 합니다. 따라서 다양한 데이터(정적 변수, 클래스 등)들을 잘 다루어야할 필요성이 생기게 되고 각 용도에 맞게 메모리를 나누어서 관리합니다.

Garbage Collector

  • 가비지 컬렉션을 수행하는 모듈 입니다. 자바 프로그램이 실행 중에 동적으로 생성한 객체가 모두 사용되었는지의 여부를 판단하고 할당된 메모리를 해제합니다.
  • 가비지 컬렉션의 대상이 되는 객체들
  • Mark And Sweep 알고리즘

Class Loader

  • JVM 안으로 클래스의 정보를 읽어들이는 역할을 하는 모듈 입니다. 프로그램 동작 시 동적으로 클래스를 로드합니다.

Execution Engine

  • 클래스의 로딩이 완료되면, 자바의 바이트코드를 읽어들어서 실제로 실행시키는 모듈입니다.

Runtime Data Area

  • Java 프로그램이 실행될 때 JVM이 실행되면서 운영체제로부터 할당받는 메모리입니다.
  • 이는 메모리의 용도에 따라 크게 5개로 나누어집니다.

1. Method Area(Static Area)

  • JVM이 읽어들인 클래스인터페이스들의 런타임 상수 풀입니다. 즉 클래스의 구성 요소인 정적 변수, 생성자, 메소드, 멤버 변수가 이 공간에 저장됩니다.

2. Heap Area

  • 자바 프로그램이 실행되면서 동적으로 생성된 객체 (new 연산자로 생성된 객체 또는 인스턴스)가 저장되는 공간입니다.
  • 이곳에 생성된 객체들은 다른 객체의 필드 또는 스택에 존재하는 다른 메서드에 의해 참조될 수 있습니다.
  • 참조하는 변수가 사라진다면 이 객체는 필요없는 것으로 간주하고 Garbage Collection에 의해서 할당이 해제됩니다.

3. Stack Area

  • 메서드가 호출되면 이 영역에 할당됩니다.
  • 먼저 들어온 거이 가장 마지막으로 나가는 구조(FILO)입니다.
  • 스레드가 생성되면 각 스레드는 스레드마다 하나의 스택을 할당받게 됩니다.
  • 스택에는 메서드 수행 시 발생되는 지역변수 또한 저장됩니다. (객체는 힙 영역)

4. Native Method Stack Area

  • 자바 이외의 언어로 된 코드를 위한 스택입니다.
  • JNI(Java Native Interface)를 통해 호출되는 다른 언어의 코드를 수행하기 위해 존재합니다.

다시 정리해보면 표와 같습니다.

메모리 영역 저장되는 값들
Method Area(Static Area) 정적 변수, 생성자, 메소드, 멤버변수
Heap Area Object
Java Stack Area Thread
Native Method Stack Native Method

5. PC Register

  • 현재 수행 중인 JVM 명령 주소를 가집니다. CPU의 PC와 같은 역할이라고 할 수 있습니다.

자바 가상 머신(JVM)의 동작 방식

1, 자바로 개발된 프로그램을 실행하면 JVM은 OS로부터 메모리를 할당받습니다.
2. 자바 컴파일러(javac)가 자바 소스코드(.java)를 자바 바이트 코드(.class)로 컴파일합니다.
3. Class Loader를 통해 JVM Runtime Data Area로 로딩합니다.
4. Runtime Data Area에 로딩된 .class들은 Execution Engine을 통해 해석합니다.
5. 해석된 바이트 코드는 Runtime Data Area의 각 영역에 배치되어 수행하며 이 과정에서 Execution Engine에 의해 GC의 작동과 스레드 동기화가 이루어집니다.

참고

https://hyoje420.tistory.com/2
https://coding-factory.tistory.com/828

반응형

'Programming Language > Java & Kotlin' 카테고리의 다른 글

[JAVA] 추상 클래스와 인터페이스의 차이  (0) 2022.09.22
[Java] 리팩토링 할 때 고려할 사항들  (0) 2021.05.30
[Java] 람다식  (0) 2019.06.13
[Java] Enum 클래스  (0) 2019.04.18
[Java] 스트림 API  (0) 2019.04.16

댓글