☕JAVA/🔎 공부 [JAVA]

[JAVA] JVM의 구조 와 메모리 구조

디카페인라떼 2022. 10. 26. 14:02

JVM 구조

자바의 주요 장점 중 하나인 OS  플랫폼의 독립성이 있다. WORN (wtite once, run anywhere)

이를 가능하게 하는 것이 바로 JVM이다. 

 

자바소스코드를 컴파일러가 컴파일하면 컴퓨터가 직접 해석 및 실행할 수 있는 바이트 코드가 되고

이를 JVM이 실행하여 Class Loader -> Bytecode verifier -> interpreter를 거쳐 
자바 소스가 어느 환경에서든지 잘 구동 될 수 있도록 해준다. 

 

  • JVM 구성요소
    • ClassLoader
      • 컴파일러가 만든 클래스 파일을 JVM 내의 메모리영역 (Runtime Data Area)에 올리는 역할
      • 이 과정은 런타임시 실행되지만, 필요하다면 계속해서 동작함.
    • Garbage Collector
      • 메모리 관리 기능을 자동으로 수행
      • 애플리케이션이 생성한 객체의 생존 여부를 판단하여 사용되지 않는 객체를 해제하는 방식으로 메모리를 자동으로 관리
    • Execution Engine
      • Class Loader를 통해 JVM 내의 메모리 영역에 배치된 바이트 코드를 실행
      • 이때, Execution Engine은 자바 바이트 코드를 명령어 단위로 읽어서 실행 (인터프리터 방식)
    • Runtime Data Area : JVM 메모리 영역 
      • Method Area
        • JVM에 의해 loading된 클래스들이 저장되며, 구현된 메소드, 상수들이 저장됨
      • Heap Area
        • JVM이 관리하는 프로그램 상에서 데이터를 저장하기 위해 런타임 시 동적으로 할당하여 사용하는 영역
        • new 연산자로 생성된 객체와 배열을 저장
        • 힙 영역에 생성된 객체와 배열은 스택 영역의 변수나 다른 객체의 필드에서 참조한다.
        • 참조하는 변수나 필드가 없다면 의미 없는 객체가 되어 Garbage Collector에 의해 관리된다
        • 힙 영역의 사용 기간 및 스레드 공유 범위
          • 객체가 더이상 사용되지 않거나 명시적으로 null 선언 시
          • 구성 방식이나 GC 방법은 JVM 벤더마다 다를 수 있음.
          • 모든 스레드에서 공유
      • Stack Area
        • method가 호출될 때마다 스택 프레임이 생성. 이것이 쌓여 스택을 구성
        • 컴파일시 size 및 life cycle이 정해짐
        • 수행되는 method 정보, 지역변수, 매개변수, 연산 중 발생하는 임시데이터 저장
        • 선입후출(FILO, First In Last Out) 구조로 push와 pop 기능 사용
        • 본(원시)타입 변수는 스택 영역에 직접 값을 가짐
        • 참조타임 변수는 힙 영역이나 메소드 영역의 객체 주소를 가짐.
      •  PC Register  
        • 현재 수행 중인 JVM 명령 주소
        • 프로그램 실행은 CPU에서 인스트럭션(Instruction)을 수행.
        • CPU는 인스트럭션을 수행하는 동안 필요한 정보를 CPU 내 기억장치인 레지스터에 저장
        • 연산 결과값을 메모리에 전달하기 전 저장하는 CPU 내의 기억장치
      • Native Method Stack Area 
        • 자바 외 언어로 작성된 네이티브 코드를 위한 Stack.
        • 즉, JNI(Java Native Interface)를 통해 호출되는 C/C++ 등의 코드를 수행하기 위한 스택.
        • 네이티브 메소드의 매개변수, 지역변수 등을 바이트 코드로 저장.

Heap Memory

  • Young Generation
    • 새로운 객체를 할당하기 위해 확보된 공간
    • 객체가 사라질때 Minor GC가 발생
    • 시간이 지나 우선순위가 낮아지면 Old 영역으로 이동함.
    • GC가 사용하지 않는 객체들을 제거하고도 객체가 가득차면 Old Generation 영역으로 보냄.
    • Eden
      • 객체들이 최초로 생성되는 공간, new 연산지를 통해 생성된 객체가 위치
      • 정기적인 가비지 수집 후 Eden 영역이 꽉 차면 라이프 주기가 길다고 판단되는 객체가 
        From (survivor1) 또는 To (suvivor2) 로 이동됨.
    • From (survivor1) ,To (suvivor2)
      • Eden에서 참조되는 객체가 Eden이 꽉 찼을 때 이동되는 공간.
  • Olde Generation = Tenured
    • Young Generation 영역에서 저장되었던 객체 중에 오래된 객체가 이동되어 저장되는 영역
    • 보통 Young 영역보다 크게 할당되어 있으며 GC가 Young 영역보다 적게 발생
    • 객체가 사라질 때 Major GC (Full GC) 가 발생
  • (~ Java 7)Permanent Generation => (Java 8~) Meta Space
    • 클래스와 메소드 메타 정보가 저장되는 공간
    • static 변수와 static 메소드가 저장되는 공간
    • Java 8 부터는 native area로 이동됨.

 


참고 블로그

'☕JAVA > 🔎 공부 [JAVA]' 카테고리의 다른 글

[JAVA] Heap 모니터링 & Heap Dump 분석하기  (0) 2022.10.26
[JAVA] BigDecimal 과 사칙연산  (0) 2022.09.14
[JAVA] List 중복 제거  (0) 2022.09.01
[JAVA] 제네릭 Generic  (0) 2022.08.26
[JAVA] Map, HashMap  (0) 2022.08.24