미니옵빠의 code stubs

자바 메모리 모델 본문

Language/Java

자바 메모리 모델

미니옵빠 2011. 8. 28. 19:39

출처: http://blog.naver.com/dalbong97/130005442609


메모리란 프로그램을 실행시킬 때 발생하는 모든 종류의 데이터를 저장하기 위한 데이터 저장소이다. 이러한 데이터들은 사용되는 형태, 시간등에 의해 성질을 구분할 수 있는데, 크게 다음과 같다.

  • 프로그램 코드

윈도우 프로그램에서는 Abc.com, Abc.exe 형태의 바이너리 코드를 나타내고,
자바에서는 Abc.class 파일을 말한다. 이러한 프로그램은 실행할 코드를 가지고 있으며,
프로그램이 실행되기 위해서는 반드시 메모리에 로드되어야 한다.

  • 임시 데이터

어떤 특정 함수(메소드)를 실행할 때 필요한 데이터로서, 매개변수, 지역변수, 리턴값 등을 들수 있다.
이러한 임시 데이터는 함수를 수행할 때 데이터를 저장할 공간을 생성하고, 함수의 수행이 끝나면 없어진다.

  • 동적 데이터

프로그램에서 필요할 때 임의로 생성하는 데이터로서,
함수 호출과과 같은 프로그램의 수행과는 무관하게 유지되어야 하는 데이터를 의미한다.

 

자바에서의 메모리는 자바 가상머신(JVM)에서 현재 실행되고 있는 자바 프로그램을 위해 제공하는 메모리를 말한다.
데이터의 성질에 따라서 논리적으로 구분된 영역에 데이터를 저장하게 되는데, 기본적으로 JVM의 메모리는 다음과 같은 세 개의 논리적인 영역으로 나뉜다.

  • 메소드 영역 (Method Area)

    자바 프로그램을 구성하고 있는 클래스의 메소드에 대한 바이트 코드를 저장하기 위해 사용하는 메모리 공간이다.
    그리고 클래스 내에 선언된 멤버 변수 중에서 static 으로 선언되어 있는 클래스 변수가 저장된다.

  • 스택 (Stack)

메소드가 호출되어 수행될 때 메소드의 매개변수, 메소드 내에 선언된 지역변수, 임시변수, 반환값 등을 저장하는 공간이다.
이러한 데이터들은 메소드가 호출되어 수행될 때만 필요하므로,
메소드 호출과 함께 이들을 저장하기 위한 메모리 공간(스택 프레임 -> 메소드 기준으로 생성됨)이 할당되고,
메소드의 수행을 마치고 호출한 쪽으로 되돌아 갈 때, 시스템에 반환된다.

  • 힙 (Heap)

자바에서 객체를 저장할 때 사용하는 메모리 공간으로, 주로 new 연산자를 이용하여 생성된 객체들이 저장된다.

 

프로그램 실행에 따른 메모리 모델의 변화 살펴보기

다음과 같은 클래스를 실행하였을때 메모리 모델의 변화를 살펴본다.

class Point {
  int x, y;

  void move(int x, int y) {
    this.x = x;
    this.y = y;
  }

  int getX() {
    return x;
  }

  int getY() {
    return y;
  }

  void setX(int x) {
    this.x = x;
  }

  void setY(int y) {
    this.y = y;
  }

  void draw() {
    System.out.println("Point(" + x + ", " + y + ")");
  }
}

class PointTest {
  static public void main(String args[]) {
    Point p1, p2 = null;

    p1 = new Point();
    p1.move(4, 4);

    // 1번 지점

    p2 = new Point();
    p2.move(2, 4);

    // 2번 지점
  }
}

===========================================================

java PointTest 실행이후 메모리 모델 변화

1. PointTest 클래스를 메로리에 로드한 상태




2. JVM 이 main 메소드를 호출 시


 


3. main 메소드에서 1번 지점




4. main 메소드에서 2번 지점


 
- 2001년 3월 마소 Jr. 자바 메모리 모델 기사를 정리함.