Programming/Java

자바 가상 머신(JVM)의 메모리 구조

목차

1) 자바의 자료형

2) JVM이란?

3) JVM의 메모리 구조

4) JVM의 실행 과정

 


1) 자바의 자료형

JVM의 메모리 구조에 들어가기에 앞서 기본적인 자바의 자료형 먼저 알아보자.

기본 자료형 (값 타입)

수치형(정수형, 실수형), 문자형, 논리형

byte, short, int, long, float, double, char, boolean

  • 변수의 실제 값을 가지고 있는 것.
  • 작고 빠르게 처리해야 하는 것은 값타입을 이용한다.
  • 메모리의 스택에 저장된다.
  • 변수의 선언과 동시에 메모리가 생성된다.
  • 변수의 타입에 따라서 메모리의 크기도 달라진다.
  • 변수를 선언할 때 new 연산자를 이용하지 않아도 자동으로 new 연산자가 호출되어 메모리가 생성된다.

 

참조형 (Reference Type, 참조타입)

클래스형, 인터페이스형, 배열

ex) String s="java";

String s = new String("java");

 

  • 실제 값은 다른 곳에 있으며 값이 있는 주소를 가지고 있어서 나중에 그 주소를 참조해서 값을 가져올 수 있다.
  • 덩치가 크면 실제 데이터는 다른 곳에 두고 그 곳에 대한 참조만 을 가지고 작업하면서 필요할 때마다 그 데이터를 열어 사용
  • 메모리의 힙에 실제 값을 저장하고 그 참조값을 갖는 변수는 스택에 저장
  • 변수의 선언과 메모리 생성은 분리되어 있다.
  • 클래스(Class) 계열들은 모두 new 연산자를 이용하여 사용자가 직접 메모리를 생성해 주어야 한다. ( 클래스, 인터페이스, 배열 등)
  • 클래스 형 중에서 기본 내장형인 String형 등은 참조타입 이다.

 

2) JVM 이란?

요약하자면..
- Java의 중간 코드를 실행할 수 있는 주체
- Java와 OS사이의 중개자 역할
- Java가 OS에 종속되지 않고 사용가능하게 해줌.
- 메모리 관리 기능(용도에 따라 여러 영역으로 나누어 관리),
Garbage Collection을 제공한다.

자바 가상 머신(Java virtual machine, JVM)은 완전한 기계어가 아닌 중간 단계의 바이트 코드를 해석하고 실행할 수 있는 가상의 운영체제 역할을 한다.

이 JVM이 있기때문에 자바의 장점 중 하나인 "운영체제에 독립적이다" 가 있는것.

하지만 JVM은 운영체제에 종속적이라서 운영체제에 맞게 설치해야한다.

또한, JVM의 다른 기능중 하나는 프로그램 메모리를 관리하고 최적화 하는것이다.

 

 

3) JVM의 메모리 구조

컴퓨터 프로그램이 실행되기 위해 필요한 메모리는 메인 메모리(램, RAM) 이며, 이 메인 메모리를 관리하는게 OS이고, JVM(자바 가상 머신)은 OS로 부터 필요한 만큼 메모리를 할당 받고 받은 이 가상의 메모리를 영역별로 나누어 관리한다.

 

 

OS로부터 받은 메모리 공간을 Runtime Data Area 라고 하며,

총 5가지의 영역인 Method Area (=Class Area), Heap Area, Stack Area, PC Register, Native Method Stack Area

이렇게 나누어서 관리한다.

 

Method 영역

JVM이 시작될 때 생성되는 공간으로 바이트코드가 해당 영역에 저장이 된다.

모든 스레드가 공유하는 영역이므로 클래스 정보, 변수 정보, static으로 선언한 변수가 저장된다.

 

Heap 영역

new연산을 통해 동적으로 생성된 객체가 저장되는 영역

GC(Garbage Collector)의 대상이 되는 공간이다.

GC가 정리하기 전까지는 계속 남아있다. 쉽게 지워지는 영역이 아님.

 

💡 참고
이때 Heap 영역은 효율적인 GC를 위해서 또 5가지 영역으로 나눈다.

 

Stack 영역

지역변수메서드의 매개변수, 임시적으로 사용되는 변수, 메서드의 정보가 저장되는 영역이다.

 

헷갈리지 말자
Person p = new Person("삔아", 26);
이 코드에서 pStack 영역에, 동적으로 생성한 Person객체Heap영역에 저장이 된다.

 

PC Register

스레드가 어떤 부분을 어떤 명령어로 수행할지 저장하는 공간이다.

즉, 스레드가 시작 될때 생성되며, 현재 수행중인 JVM의 명령어 주소를 저장하는 공간이다.

 

Native Method Stack

JAVA가 아닌 다른 언어로 작성된 코드를 위한 공간이다.

실제 실행 할 수 있는 기계어로 작성된 프로그램을 실행시키는 공간.

 

 

4) JVM의 실행 과정

클래스 로더(Class Loader)가 컴파일된 자바 바이트코드를
런타임 데이터 영역(Runtime Data Areas)에 로드하고,
실행 엔진(Execution Engine)이 자바 바이트코드를 실행한다.

 

우선 자바로 작성한 코드는 다음 그림과 같은 과정을 통해 수행된다.

1. 작성한 자바 소스(.java 파일)를 자바 컴파일러를 통해 자바 바이트 코드(.class 파일) 로 컴파일 한다. 

2. 컴파일 된 바이트 코드를 JVM의 Class Loder에게 전달한다.

3. Class Loder는 동적로딩 (Dynamic Loading) 을 통해 필요한 클래스들을 로딩 및 링크하여 런타임 데이터 영역 (Runtime Data Areas), 즉 JVM의 메모리 에 올린다.

4. Execution Engine은 JVM 메모리에 올라온 바이트 코드들을 명령어 단위로 하나씩 가져와서 실행한다.

 

 


 

 


이번 JVM 포스팅이 좀 힘들었는데... 가지고 있는 책들은 JVM에 대해 자세히 안나와있고 학원에서도 잠깐 짚고 넘어갔던 부분이기때문에 ... 😂

관련 도서를 하나 더 샀는데 .. 그 부분에서 잘 정리가 되있으면 나중에 공부하다가 포스팅 해야겠다 .. 

 

참고

d2.naver.com/helloworld/1230

www.youtube.com/watch?v=AWXPnMDZ9I0&t=411s

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

String s = "test"와 String s = new String("test")의 차이점  (0) 2021.04.24
Map.getOrDefault(Object Key, Integer defaultValue)  (2) 2021.04.18
Stack과 Queue  (4) 2021.04.13
Java란?  (1) 2021.03.19
JDK 환경변수 설정  (0) 2021.03.03