JVM 메모리 구조

개요

JVM은 Java Virtual Machine의 약어로 자바 언어를 수행하기 위한 기구이다.

OS가 프로세스를 처리하기 위해 하드웨어에 메모리를 할당 하는 것 처럼

JVM이 자바 프로그램을 실행 할때 OS가 JVM에 메모리를 할당해준다.

의문점은 여기서 생긴다.

인간의 자원은 유한하고 그렇기 때문에 최선의 효율, 가성비를 따져가며 사용한다.

컴퓨터의 메모리 또한 마찬가지이다.

메모리 또한 용량이 한정적이기 때문에 프로그래머는 메모리 효율을 고려하며 코드를 작성해야 한다.

메모리 효율을 이해하려면 JVM에서 자원이 어떻게 할당되는지 아는것이 첫번째라고 생각해 이 글을 정리한다.

자바 프로그램 실행과정 및 메모리 구조

Runtime Data Area

  1. .java 형태의 소스코드(Source code)를 자바 컴파일러(javac)가 .class형태의 바이트 코드 (Byte code)로 바꾸어준다.
  1. 바이트코드로 생성이 되었다면 컴파일이 성공적으로 이루어진 것
  1. .class파일은 Class Loader가 Runtime Data Area(JVM 메모리영역)로 이동(Loading)시킨다.
  1. Method Area와 Heap Area는 모든 스레드가 공유 가능

    Method Area

    • JVM이 시작될 때 생성되는 공간
    • 클래스 정보, 변수 정보, static으로 선언한 변수 저장
    • 주로 초기화 되는 대상의 정보들이 올라가게 됨

    Heap Area

    • 동적으로 생성된 객체가 저장되는 영역
    • 객체 생성 후 메소드 실행하면 해당 객체에 대한 정보를 Method Area에 저장하게 됨
    • GC(Garbage Collector)의 대상이 되는 공간
    • Heap Area의 경우 New/Young Generation, Tenured Generation, Permanet Generation으로 나뉘는데 이 부분은 GC에 대한 포스팅에서 자세히 다루겠다.
  1. Stack Area, PC register, Native Method Stack은 스레드마다 하나씩 생성된다.

    Stack Area

    • 지역변수, Method의 매개변수, 임시적으로 사용되는 변수, Method의 정보다 저장됨

    • 휘발성으로 사용되는 데이터들이 주로 Stack Area에 저장된다. (Reference Type 들)

    • Person p = new Person("홍길동", 20); 이라는 코드가 있을 때

      새로운 객체 p의 주소값은 stack에 저장되며 "홍길동", 20이라는 데이터 값은 Heap에 저장됨

    PC register

    • Thread가 실행될 때 생성
    • PC(Program Counter) = 어떤 부분을 어떤 명령으로 실행할 지 기록해 놓는 것

    Native Method Stack

    • JAVA가 아닌 다른 언어로 작성된 코드를 위한 공간
  1. Runtime Data Area에 Loading된 class 파일(바이트 코드)가 Execution Engine을 통해 실행됨
  2. Execution Engine에서는 인터프리터를 통해 자바 바이트 코드를 명령어 단위로 읽어서 실행하거나 JIT(Just In TIme) 컴파일러를 이용해 자주 호출되는 메소드를 미리 뭉텅이로 기계어로 저장시켜 놓는 방식을 사용한다.

+ Recent posts