본문 바로가기

자바의 정석 정리

자바의 정석 - 6.4 JVM의 메모리 구조

6.4.1 JVM 구조

  • JVM은 메서드 영역, 힙 영역, 호출스택 영역으로 구분할 수 있다.

6.4.2 메서드 영역(method area)

  • 어떤 클래스가 사용되면, JVM은 해당 클래스파일(.class)의 파일을 읽어 분석하여 클래스에대한 정보를 메서드 영역에 저장한다. 이때, 클래스 변수도 메서드 영역에 로딩되어 모든 인스턴스가 클래스 변수를 공유한다.

6.4.3 힙 영역(heap area)

  • 프로그램 실행중 생성되는 인스턴스가 생성되는 공간
  • 인스턴스 변수들이 생성되는 공간
  • 각 인스턴스는 힙 영역안에서 독립적인 공간을 갖는다.

6.3.5 호출스택(call stack, execution stack)

  • 작업에 필요한 메모리 공간제공
  • 지역변수(매개변수 포함)및 중간 연산 결과를 저장하는데 사용
  • 작업을 마치면 메모리 반환

6.3.6 메서드 호출에 따른 메모리 할당 순서

  1. 메서드가 호출되면 수행에 필요한 만큼의 메모리를 스택에 할당 받는다.
  2. 실행중인 메서드에서 다른 메서드를 호출할 경우 실행중인 메서드를 일시정지하고 호출한 다른 메서드를 스택에 할당한다.
  3. 호출된 작업이 끝나면 메모리를 반환하고 메서드 수행 결과를 일시정지된 메서드로 가져간 뒤 메서드 일시정지 해제

6.3.7 기본형 매개변수와 참조형 매개변수

  • 기본형 매개변수 : 기본형 값 복사. 변수의 값을 읽기만 가능
  • 참조형 매개변수 : 인스터스의 주소 복사. 값을 읽고 변경 가능
class Data{ int x;}

//기본형 매개변수
Data d1 = new Data();
d1.x = 10
chage(d1.x) //기본형 값 복사

//참조형 매개변수
Data d2 = new Data();
chage(d2) //인스턴스 주소 복사

6.3.8 배열을 이용한 값 변경

  • 배열을 매개변수로 전달할 경우 배열의 주소가 복사되기 때문에 변경 가능
class A{
    public static void main(String[] args){
        int[] x = {10};
        chage(x);
        System.out.println(x[0]) // x = 1000
    }

    static void change(int[] x){
        x[0] = 1000;
    }
}

6.3.9 참조형 반환타입

  • '객체의 주소' 반환
Data a(Data d){
    Data tmp = new Data();
    tmp.x = d.x
    reuturn tmp;
}