[객체지향] JVM메모리구조

송송승현's avatar
Nov 12, 2024
[객체지향] JVM메모리구조

JVM - 자바 가상 머신

  • JDK를 설치하면 jre, 컴파일러가 설치
    • jre - 자바 런타임 환경, 라이브러리들과 JVM을 들고 있음
    • 컴파일러(javac) - 하드에 저장된 java파일을 컴파일 하기 위해 메모리에 올림. 로드된 java파일을 컴파일러가 class파일로 변환하여 하드에 저장하게 된다. class 파일을 JVM이 해석이 가능하다.
  • 기본적인 시스템 구조
    • H/W - OS - APP
  • JVM 이 추가된 구조
    • H/W - OS -JVM -APP 구조가 생성
  • RAM의 어느 영역을 논리적으로 쪼개서 JVM에게 할당
  • JVM
    • class 파일 로드 - static 찾기 - main 실행 - main의 queue가 생성됨

구조

  • 메소드 영역(Method Area)
    • 정의: 클래스 수준의 메타데이터를 저장하는 영역
    • 내용: 클래스 정보(메서드, 필드), 인터페이스, 상수, 정적 변수, 메서드 코드 등.
    • 역할: JVM이 시작될 때 생성되며, 모든 쓰레드가 공유
  • 힙 영역(Heap Area)
    • 정의: 객체와 배열이 동적으로 할당되는 영역
    • 내용: 모든 객체와 배열.
    • 역할: GC(가비지 컬렉션)가 관리하며, 모든 쓰레드가 공유. 메모리 할당 및 해제
  • 스택 영역(Stack Area)
    • 정의: 각 쓰레드가 자신만의 스택을 가지며, 메서드 호출 시 프레임이 생성
    • 내용: 지역 변수, 메서드 호출, 매개 변수, 반환 값 등.
    • 역할: 메서드 실행의 상태를 관리하며, 프레임은 LIFO(Last In, First Out) 방식으로 관리
      • LIFO(Last In, First Out) : 스택에 마지막으로 입력된 자료가 제일 먼저 삭제 하는 방식
  • PC 레지스터(Program Counter Register)
    • 정의: 각 쓰레드마다 존재하며, 현재 실행 중인 JVM 명령의 주소를 가리킴
    • 역할: JVM이 현재 실행할 명령을 추적.
 

예제

public class JvmTest { int num1 = 1; static int num2 = 2; void method1(int num3){ System.out.println("num3 : "+num3); int num4 = 4; System.out.println("num4 : "+num4); } public static void main(String[] args) { System.out.println("JVM Start"); System.out.println("num2 : "+JvmTest.num2); JvmTest jt = new JvmTest(); System.out.println("num1 : "+jt.num1); jt.method1(3); } }

코드 설명

  • Method Area
    • 클래스 로드 시 JvmTest 클래스의 메타데이터가 저장
    • static 변수 num2 와 method 메서드 정의가 저장
  • Heap Area
    • new JvmTest()로 생성된 객체 jt가 힙 영역에 저장
    • 객체 jt의 인스턴수 변수 num1이 저장
  • Stack Area
    • 메인 메서드의 호출 프레임이 스택 영역에 생성
    • 메인 메서드 내에서 jt 변수는 힙 영역의 JvmTest 객체를 참조
    • method1 메서드 호출 시 새로운 스택 프레임이 생성
    • method1 메서드의 매개 변수 num3와 지역 변수 num4가 스택 프레임에 저장

흐름

클래스 로딩 단계

Method Area
  • JvmTest 클래스가 로드되면 Method Area에 클래스 구조 정보와 정적 변수 num2가 저장
  • 정적 메서드와 인스턴스 메서드도 이 영역에 저장

main 메서드 실행 단계

Stack Area
  • JVM은 main 메서드를 호출하여 main 스택 프레임을 생성
  • 이 스택 프레임에는 args 변수가 저장
PC Register
  • 현재 실행 중인 명령어를 추적

JvmTest jt = new JvmTest()

Heap Area
  • new JvmTest()로 생성된 객체가 힙 영역에 저장
  • num1 인스턴스 변수가 초기화되어 저장
Stack Area
  • jt 참조 변수가 스택 프레임에 추가되고, 힙 영역의 객체를 참조

jt.method1(3)

Stack Area
  • method1 메서드의 스택 프레임이 생성됩니다.
  • 매개 변수 num3와 지역 변수 num4 가 저장됩니다.
 

예제의 메모리 구조를 그림으로 변환

 
notion image
 
Share article

송승현의 블로그