개발자 준비/JAVA

JVM 메모리 구조

osul_world 2022. 3. 4. 10:44
728x90

JVM 메모리 구조


대규모의 프로젝트를 개발해야 할 때 적어도 Java로 개발한다면, JVM메모리 구조에 대한 이해는

필수적이며 기본적으로 알아야 할 개념인 것이다.

 

메모리관리에 따라 프로그램의 성능은 월등히 차이가 날 수 있으며, 메모리관리를 제대로 하지 못해 성능저하 현상이 일어나는 경우는 보통 33%가 코드를 잘 못짰거나, 메모리에 대한 이해없이 설계를 한 경우다. 생각이상으로 더 중요한게 메모리개념인 것이다.

 

진정한 자바 개발자라면 꼭 알아둬야 한다

 

JVM

일전에 JVM(자바 가상 머신)에 대해 정리한적이 있다.

운영체제와 플랫폼에 상관없이 JVM만 있다면 어디서는 JAVA를 동작시킬수있게 해주는 자바의 핵심이다.

 

자바로 짠 프로그램이 동작하는 순서는 아래와 같다.

1. Java Compiler(자바 컴파일러)에 의해 Java source(.java) 파일은 Byte code로 변환된다.

 

2. Class Loader(클래스 로더)는 이 변환된 Byte code(.class) 파일을 JVM 내로 class를 로드하고 Link작업을 통해 배치 등 일련의 작업을 한다. 또 런타임시 class를 load한다.

 

3. Execution Engine(실행 엔진) 은 Class Loader를 통해 JVM 내부로 넘어와 Runtime Data Area(JVM 메모리)에 배치된 Byte code들을 명령어 단위로 실행시킨다.

 

4. GC(Garbage Collector)는 어플리케이션이 생성한 객체의 생존 여부를 판단하여, 더이상 참조되지 않거나 null 인 객체의 메모리를 해체시켜 메모리 반납을 한다.

 

5. Runtime Data Areas(JVM 메모리) 런타임 데이터 영역은 JVM메모리로 Java 어플리케이션이 실행하면서 할당받은 메모리영역이다.

 

런타임시에 할당받는 런타임 데이터 메모리 영역은 6가지로 구분된다.

Method, Runtime Constant Pool, Heap, Stack, PC Register, Native Method Stack

 

 

 

Method (Static) Area

  • JVM이 읽어들인 클래스와 인터페이스 대한 런타임 상수 풀, 멤버 변수(필드), 클래스 변수(Static 변수), 생성자와 메소드를 저장하는 공간이다.

 

Runtime Constant Pool

  • 메소드 영역에 포함되지만 독자적 중요성이 있다.
  • 클래스 파일 constant_pool 테이블에 해당하는 영역이다.
  • 클래스와 인터페이스 상수, 메소드와 필드에 대한 모든 레퍼런스를 저장한다.
  • JVM은 런타임 상수 풀을 통해 해당 메소드나 필드의 실제 메모리 상 주소를 찾아 참조한다

 

Heap Area

  • JVM이 관리하는 프로그램 상에서 데이터를 저장하기 위해 런타임 시 동적으로 할당하여 사용하는 영역이다.
  • New 연산자로 생성된 객체 또는 객체(인스턴스)와 배열을 저장한다.
  • 힙 영역에 생성된 객체와 배열은 스택 영역의 변수나 다른 객체의 필드에서 참조한다.
  • 참조하는 변수나 필드가 없다면 의미 없는 객체가 되어 GC의 대상이 된다.

 

Stack Area

  • 메소드 정보, 지역변수, 매개변수, 연산 중 발생하는 임시 데이터 저장
  • 기본(원시)타입 변수는 스택 영역에 직접 값을 가진다.
  • 참조타임 변수는 힙 영역이나 메소드 영역의 객체 주소를 가진다.

 

모든 쓰래드는 힙과 메소드 영역을 공유한다.

나머지 Stack과 같은 영역은 각자 가지고있다.

 

 

Reference


https://limkydev.tistory.com/51

https://hoonmaro.tistory.com/19

728x90