Dico

[Java] 객체지향 프로그래밍 - JVM의 메모리 구조

Java Virtual Machine

자바 가상 머신

응용프로그램이 실행되면 시스템으로부터 프로그램을 수행하는데 필요한 메모리를 할당받아 용도에 따라 여러 영역으로 나누어 관리한다.

Method AreaCall StackHeap
클래스 데이터메서드 작업인스턴스

메서드 영역 Method Area

클래스에 대한 정보, 클래스 변수를 저장한다.

어떠한 클래스가 사용되면, 해당 클래스의 클래스파일(*.class)을 읽고 분석한 정보를 저장한다.

호출 스택 Call Stack / Execution Stack

메서드 작업 영역.

  • 메서드의 작업에 필요한 메모리 공간을 제공한다.

     메서드가 작업을 수행하는 동안 지역변수(매개변수 포함)들과 연산의 중간결과 등을 저장한다.

     호출된 메서드는 수행에 필요한 만큼만 메모리를 스택에 할당 받는다.

     작업이 끝나면 메모리를 반환하고 스택에서 제거된다.

  • 위치

     호출스택의 제일 상위에 위치하는 메서드가 현재 실행 중인 메서드다. 나머지는 대기 상태에 있게 된다.

     아래에 있는 메서드가 바로 위에 메서드를 호출한 메서드다.

1500861953051_post42.png

힙 Heap

모든 인스턴스가 생성되는 공간.

인스턴스 변수 저장한다.

선언 위치에 따른 변수 종류

인스턴스 변수 instance variable

클래스 영역에 선언.

독립적인 저장공간을 가진다.

인스턴스마다 고유한 상태를 유지해야 하는 속성의 경우 사용한다.

인스턴스가 생성될 때마다 생성되어 각 인스턴스마다 각기 다른 값을 유지한다.

class Variables{
	int iv;
}

클래스 변수 class variable

앞에 static을 단 인스턴스 변수를 클래스 영역에 선언.

저장공간(변수)을 공유한다.

한 클래스의 모든 인스턴스들이 공통된 값을 유지해야 하는 속성의 경우 사용한다.

' 클래스이름.클래스변수 '와 같은 형식으로 인스턴스를 생성하지 않고 바로 사용할 수 있다.

클래스가 메모리에 로딩될 때 생성된다.

class Variables{
	static int cv;
}

지역 변수 local variable

메서드 내에 선언.

메서드가 종료되면 소멸된다.

for문/while문의 블럭 내에 선언된 지역변수는, 지역변수가 선언된 블록{} 내에서만 사용 가능하다.

class Variables{
	void method(){
		int lv;
	}
}

인스턴스 변수와 클래스 변수의 차이

public class Test {
    public static void main(String[] args) {

        Variables v1, v2;
        v1 = new Variables();
        v2 = new Variables();

        v1.iv = 3;
        v2.cv = 5;

        System.out.println(v1.iv + ", " + v1.cv);     // 3, 5
        System.out.println(v2.iv + ", " + v2.cv);     // 0, 5
    }
}

class Variables {
    int iv;
    static int cv;
}

참고 서적: 자바의 정석 3판