언어/자바

자바의 JVM메모리 구조

ballde 2021. 9. 1. 09:04
  • 프로그램 메모리를 관리하고 최적화해준다. 자바 바이트코드(.class)를 운영체제에 맞는 시스템 명령어로 번역하여 실행
  • JVM은 자바 가상 머신으로 자바 프로그램을 실행시키기 위해 반드시 실행되어야 하는 기초가 되는 프로그램
  • 자바라는 언어는 기본적으로 동적할당을 프로그래머에게 맡기지 않는다. C언어에서 malloc(), realloc() 등의 함수를 통하여 프로그래머가 힙 영역에 동적할당하고 free() 함수를 통해 할당을 해제하는 작업을 프로그래머가 직접한다. 하지만 자바에서는 그 작업을 JVM에서 전적으로 맡고 스스로 수행한다. 이 기능을 가비지 컬렉션(Garbage Collection)이라고 부른다.
  • 대규모 프로젝트를 진행함으로써 JVM 메모리 구조를 아느냐 모르느냐에 따라 최적화 차이가 나타남 → 중요!!!

Untitled

Garbage Collector

  • 자바 프로그램이 실행중에 동적으로 생성한 객체가 모두 사용되었는지의 여부를 판단하고 할당된 메모리를 해제한다.

Class Loader

  • 클래스의 정보를 읽어 들이는 역할을 하는 모듈, 동적으로 클래스를 로드
  • jvm 메모리에 할당함

Excute Engine

  • 클래스의 로딩이 완료되면, 자바의 바이트 코드를 읽어들어서 실제로 실행시키는 모듈

Runtime Data Area

  • JVM이 실행되면서 운영체제로 부터 할당받는 메모리 -
  1. method area(static area)
    • JVM이 읽어들인 클래스와 인터페이스들의 런타임 상수 풀
    • 정적 변수, 생성자, 메소드, 멤버 변수가 이 공간에 저장
    • 애플리케이션이 로드될때 모든 클래스 정보들이 JVM 메모리의 Method 영역에 저장된다.
    • static 같은 정적 변수, 정적 메소드의 경우 처음 애플리케이션을 로드할때, 초기화가 이루어지기 때문에, 별도의 힙 메모리에 인스턴스 생성없이 바로 사용할 수 있는 것이다.
  2. Heap area
    • 인스턴스, 배열 등이 있는 곳
    • 동적으로 생성된 객체가 저장되는 공간
    • 다른 객체의 필드 또는 스택에 존재하는 다른 메소드에 의해 참조 될 수 있음
    • 참조하는 변수가 사라지면 garbage collector에 의해 해제
    • 1, 2 는 모든 영역을 공유
  3. stack area
    • 참조 변수는 여기에 생성
    • 메소드가 호출되면 이 영역에 할당, FIFO(first in last out)
    • 메서드 수행시 발생하는 지역변수 또한 저장 (다 heap에 저장하면 너무 비쌈)
    • 메서드가 호출시 메모리 할당, 메서드가 작업을 수행하는 동안 지역변수들과 연산의 중간결과 등을 저장하는데 사용
    • 수행하면 메모리 반환, 스택에서 제거
  4. PC register
    • 현재 수행중인 JVM 명령 주소를 가진다.
  5. native method stack area
    • 자바 이외의 언어로 된 코드를 위한 스택, JNI(java native interface)를 통해 호출되는 다른 언어의 코드를 수행하기 위해 존재

위의 얘기를 코드로 보면~

Person person = new Person("sfd", 23);

new 키워드로 생성하면 heap 메모리 영역에 인스턴스가 하나 생성

stack영역에 Person person 이라는 주소값을 저장하는 참조 변수를 생성, heap 메모리에 생성된 인스턴스의 주소값을 저장하고 있음

→ 이유 : heap 메모리는 생성하고 제거하는데 비쌈

자바의 실행 과정

컴파일

  • 사람이 이해하는 언어를 기계어로 바꾸는 과정
  • 자바소스(.java)를 읽어 자바 바이트코드 (.class)로 변경

빌드

  • 소스코드 파일을 실행 가능하게 만들어주는 과정

실행 과정

  1. 자바 컴파일러를 통해 자바 클래스 파일(.java)를 바이트코드(.class)로 변환
  2. 클래스 로더를 통해 자바 바이트 코드를 JVM 런타임 데이터 역역에 로드
  3. 실행 엔진 통해 실행
  • 빌드 툴을 통해 실행 가능한 파일로 빌드 한 후에 실행하거나 class파일을 직접 실행

자바구조