[자바/Java] - 메모리 구조

2025. 2. 26. 19:52·자바
728x90
반응형
SMALL

참고 - https://www.youtube.com/watch?v=zta7kVTVkuk&list=PLlTylS8uB2fA5PevGI6ARN6v-VQWmqaix&index=15

 

자바 메모리 구조를 알려면 JVM부터 알아야 한다.

1.JVM이란?

Java Virtual Machine의 줄임말이다.

자바 어플리케이션을 어느 CPU에나 OS에서도 실행할 수 있게 지원하는 역할을 수행한다.

자바 코드를 컴파일하여 바이트 코드로 변환하여 해당 운영체제가 이해할 수 있는 기계어로 실행

자바 언어는 JVM에 의해 운영체제에 독립적이라는 장점을 가짐

 

 

2. JVM 구조

2.1 자바 어플리케이션 실행 과정

1) 어플리케이션이 실행되면 JVM이 OS로 부터 메모리를 할당받는다. -> 할당받은 메모리를 용도에 따라 구분하여 관리

2)  자바 소스코드(.java)를 CPU가 인식하지 못하므로 자바 컴파일러(java.exe)가 자바 소스코드를 읽어 바이트코드(.class)로 변환시켜준다.

※ 자바컴파일러는 JDK를 설치하면 bin에 존재하는 javac.exe이다. (JDK에 컴파일러가 포함되어 있음)

3. Class Loader를 통해 바이트 코드를 JVM으로 로딩 -> 객체들이 메모리에 올라오는 작업이라고 보면 됨

4. 로딩된 바이트 코드는 Execution Engine을 통해 해석됨

 

2.2JVM구성

JVM은 크게 4가지로 구성되어있다.

1. Class Loader

2. Execution Engine

3. Garbage Collector

4. Runtime Data Area

 

2.2.1 Class Loader

-         JVM으로 바이트 코드(.class)를 로드하고, 링크를 통하여 메모리 영역인 Runtime Data Area에 배치하는 작업을 수              행하는 모듈

-         로드된 바이트 코드들을 엮어서 JVM의 메모리 영역인 Runtime Data Areas에 배치함

-         클래스를 메모리에 올리는 로딩 기능은 한번에 메모리에 올리지 않고, 어플리케이션에서 필요한 경우 동적으로                  메모리에 적재하게 됨

-         런 타임시 동적으로 클래스를 로드하고 jar 파일 내 저장된 클래스들을 JVM 위에 탑재합니다.

-         클래스 파일의 로딩 3단계 : Loading -> Linking -> Initialization

 

2.2.2 Execution engine

Runtime Data Area에 할당된 바이트 코드를 실행시키는 주체이다.

즉, 링크된 클래스파일을 실행시키는 역할을 한다.

Execution Engine 구조

1) Interpreter

바이트 코드를 해석하여 실행하는 역할을 수행한다.

 

같은 메소드라도 여러번 호출될 때 매번 새로 수행되어야한다.

 

2) JIT(Just In Time) Compiler

인터프리터의 단점을 해소

 

반복되는 코드를 발견하여 전체 바이트 코드를 컴파일 하고 그것을 Native Code로 변경하여 사용한다.

※Navtive Code - 자바에서 부모가 되는 C/C++, 어셈블리언어 의미

 

3) Garbage Collector(GC)

-더 이상 사용되지 않는 인스턴스를 모아 제거하는 역할을 수행한다.

 

2.2.3 Runtime Data Area

어플리케이션이 동작하기 위해 OS에서 할당받은 메모리 공간을 의미

 

5가지로 구성되어있다.

1)Method Area

-         Static으로 선언된 변수들을 포함하여 Class 레벨의 모든 데이터가 이곳에 저장된다.

-         JVM마다 단 하나의 Method area가 존재한다.

-         Runtime Constant Pool 이라는 별도의 영역이 존재하는데

           -> 상수 자료형을 저장하고 참조하는 역할을 한다.

 

2)Heap Area

-         객체를 저장하기 위한 메모리 영역이다.

-         new 연산자로 생성된 모든 객체와 인스턴스변수, 그리고 배열을 저장한다.

-         Heap 영역은 두 영역으로 구분가능하다.(Young,Old)

-         Young Generation: 생명주기가 짧은 객체를 GC대상으로 하는 영역 

                                         Eden 에 할당 후 S0 과 S1을 거쳐 오래 사용되는 객체를 Old로 이동시킨다. 오래사용되었다고                                             판단되는 객체들이 Old로 이동한다.

 

-         Old Generation: 생명주기가 긴 객체를 GC 대상으로 하는 영역이다.

-         GC 생명주기에 의해 지속적으로 메모리가 정리된다.

 

-         Method Area와 Heap Area는 여러 스레드들 간에 공유되는 메모리이다.

          -> JVM에 하나만 존재하기 때문에 멀티 스레딩이 가능하다.

 

3) Stack Area

-        각 스레드를 위한 분리된 Runtime Stack영역

-        메소드를 호출할 때마다 Stack Frame으로 불리는 Entry가 Stack Area에 생성

-        스레드의 역할이 종료되면 바로 소멸되는 특성의 데이터를 저장

-        각종 형태의 변수나 임시 데이터, 스레드 또는 메소드의 정보를 저장

 

4) PC Register(Program Counter)

-        각 Thread가 시작될 때 생성되며, 현재 실행중인 상태 정보를 저장하는 영역

-        Thread가 로직을 처리하면서 지속적으로 갱신됨

-        Thread가 생성될 때마다 하나씩 존재함

-        어떤 명령을 실행해야 할지에 대한 기록(현재 수행중인 부분의 주소)

 

5)    Native Method Stack

-        바이트 코드가 아닌 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역

-        Java가 아닌 다른 언어로 작성된 코드를 위한 영역

-        Java Native Interface를 통해 바이트 코드로 전환하여 저장

-        각 스레드별로 생성

 

※JNI란?

자바가 다른 언어로 만들어진 어플리케이션과 상호작용 할 수 있는 인터페이스를 제공하는 것

JVM이 Native Method를 적재하고 수행할 수 있도록 한다.

728x90
반응형
LIST

'자바' 카테고리의 다른 글

자바 - String 클래스  (0) 2025.04.15
[Java/자바] - ASCII(아스키코드) 문자 ↔ 숫자  (1) 2025.02.24
[Java] - 예외처리(try catch 구문)  (1) 2025.01.31
'자바' 카테고리의 다른 글
  • 자바 - String 클래스
  • [Java/자바] - ASCII(아스키코드) 문자 ↔ 숫자
  • [Java] - 예외처리(try catch 구문)
코린이 파닥거리기
코린이 파닥거리기
    반응형
    250x250
  • 코린이 파닥거리기
    코린이 파닥거리기의 블로그
    코린이 파닥거리기
  • 전체
    오늘
    어제
    • 분류 전체보기 (123) N
      • 백준[파이썬] (52) N
      • Spring (31)
      • CS (1)
      • 자바 (4)
      • 백준[자바] (20)
      • 프로그래머스 (5)
      • 토이프로젝트 (1)
      • SWEA (2)
      • MSA (6) N
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    코딩테스트
    스프링
    백준
    MSA
    SWEA
    자바
    db
    SpringBoot
    컨테이너
    스프링부트
    재귀
    스프링 부트와 AWS로 혼자 구현하는 웹 서비스
    JPA
    spring
    테스트코드
    Java
    JWT
    프로그래머스
    누적합
    파이썬
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
코린이 파닥거리기
[자바/Java] - 메모리 구조
상단으로

티스토리툴바