본문 바로가기
프로그래밍/java

자바 메모리 구조

by 신일석 2019. 10. 17.

자바 메모리 구조

자바의 메모리 관리는 확장 가능한 방식의 응용 프로그램을 조정하기 위해 필요한 기술이다.

JVM

JVM은 컴퓨터가 자바 프로그램을 실행할 수 있도록하는 추상 컴퓨팅 시스템이다.
JVM은 코드를 로드, 검사, 실행하고 런타임 환경을 제공한다.

이런 특징으로

  • 자바 프로그램은 오류가 발행해도 JVM만 다운될 뿐 전체 시스템에 데미지를 주지 않는다.
  • 플랫폼에 의존적이지 않아 모든 자바 프로그램의 구동이 가능하다.
  • 동적할당을 프로그래머가 담당하는 C언어와 달리 JVM에서 관리한다.

구조

JVM 구조

자바 실행 과정

1.실행 될 클래스를 메모리에 로드 후 초기화 작업을 수행
2. 메소드와 클래스 변수들을 해당 메모리 영역에 배치
3. 클래스 로드가 끝난 후 JVM은 main 메소드를 찾아 지역변수, 객체변수, 참조변수를 스택에 쌓음.
4. 코드를 따라 진행하면서 함수 호출, 객체 할당 등의 작업 수행

Runtime Data Area

Class Loader

프로그램 동작시 바이트 코드(.class파일) - 클래스를 메모리(아래 Runtime Data Area)로 적재한다.

Execution Engine

Class Loader에 의해 클래스들이 메모리에 적재되면, 클래스들을 기계어로 변경해 명령어 단위로 실행한다.
Interpreter 방식과 Just-In-time 컴파일러를 이용하는 방식이 있다.

Just-In-Time 컴파일러는 전체 바이트 코드를 네이티브 코드로 컴파일하여 실행할 수 있게 함으로서 성능을 높이는 방식이다.

Garbage Collector

Heap 메모리 영역에 생성된 객체들 중에 참조되지 않는 객체들을 탐색 후 메모리에서 제가한다.
참조가 없어질 때 바로 해제되는 것은 아니다.
GC가 수행되는 동안 GC를 수행하는 쓰레드가 아닌 다른 모든 쓰레드는 일시정지된다.

Runtime Data Area

자바 프로그램이 실행될 때 JVM이 운영체제로 부터 할당받는 메모리 영역이다.
자바 어플리케이션을 실행할 때 사용되는 데이터들이 적재된다.

용도에 따라 5개로 구성

  1. Mathod Area
  2. Heap Area
  3. Stack Area
  4. PC Register
  5. Native Method Stack

1, 2번 영역은 모든 쓰레드가 공유하고
3, 4, 5번 영역은 쓰레드 별로 생성되며 공유되지 않는다.

Method (Static) Area

클래스와 인터페이스의 런타임 상수(Constant Pool) 풀이다.

  • static 변수(클래스 멤버 변수, 정적 변수)
  • 메소드
  • 생성자
  • final class 변수 ... 등

Heap Area

자바 프로그램이 실행되어 JRE 클래스 및 동적으로 생성된 Java 오브젝트가 저장되는 공간이다.
새로운 객체는 항상 힙 공간에 생성되며이 객체에 대한 참조는 스택 메모리에 저장된다.
메소드 영역에 로드된 클래스만 생성이 가능하다.
이러한 개체는 전역 액세스 권한이 있으며 응용 프로그램의 어느 곳에서나 액세스 할 수 있고,
다른 객체의 필드 또는 스택에 존재하는 다른 메소드에 의해 참조되며,
참조하는 변수가 없으면 필요없는 것으로 간주되어 Gabage Collector에 의해 해제된다.

  • new 키워드로 생성된 객체
  • 배열 ... 등

Stack Area

정적 메모리 할당 및 스레드 실행에 사용된다.
여기에는 메소드에 고유 한 (1)기본 값과 메소드에서 (2)참조되는 힙에있는 오브젝트에 대한 참조가 포함한다.
Last-In-First-Out (LIFO)의 구조이다.
메소드가 호출되면 이 영역에 할당되고, 사용이 종료되는 해제된다.
각 스레드는 스레드마다 하나의 스택을 할당받게 된다.
힙 영역의 객체를 참조할 수 있다.

  • 지역변수, 파라미터, 리턴 값
  • 연산에 사용되는 임시 값

int a = 10; // 스택에 int 크기의 메모리 공간을 확보하고 이름이 a라고 붙여준다. 값은 10.
Person p = new Person(); // Person p를 스택에 생성하고, new로 생성된 Person의 인스텀스를 힙에 생성한다. 스택에 p는 힙 영역의 주소값을 가지고 있게 된단. 이를 참조라고 표현한다.

PC Register

수행중인 JVM 명령 주소(Program Counter)를 저장한다.
Thread가 생성될 때마다 생성된다.

Program Counter : Thread가 실행되는 부분의 주소와 명령

Native Methos Stack

자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역이다.
보통 C나 C++ 등의 코드로 작성된 코드를 수행하기 위한 스택이다.

예제

class Person {
    int pid;
    String name;

    // constructor, setters/getters
}

public class Driver {
    public static void main(String[] args) {
        int id = 23;
        String pName = "Jon";
        Person p = null;
        p = new Person(id, pName);
    }
}

스택과 힙