[Must Have Java][2단계] 10 자바의 메모리 모델

yesjuhee·2022년 11월 6일
0

Java 공부

목록 보기
4/6

Must Have 이재환의 자바 프로그래밍 입문 책을 읽고 정리한 글입니다.

런타임 데이터 영역들

  • 메서드 영역
    • 프로그램 실행에 대한 코드, 스태틱 변수 및 메서드, 런타임 상수 풀이 메서드 영역에 생성됨
    • 이 영역에 저장된 내용은 프로그램 시작 전에 로드되고 프로그램 종료 시 소멸됨
    • runtime constant pool : 런타임 상수 풀. 컴파일 타임에 알려진 숫자 리터럴부터 런타임에 확인되어야 하는 메서드 및 필드 참조에 이르기까지 여러 종류의 상수 포함
  • 스택 영역
    • 메서드 호출 시, 해당 메서드의 매개변수, 지역 변수가 프레임 형태로 생성되어 스택 영역으로 쌓였다가 사라짐
    • 프레임 영역을 벗어난 다른 메서드의 변수들은 서로 참조할 수 없음
  • 힙 영역
    • 클래스의 객체, 배열이 new 연산자에 의해 힙 영역에 동적으로 생성됨
    • 생성된 객체는 자동 저장소 관리 시스템인 가비지 컬렉터에 의해 사용이 없음이 확인되면 자동으로 제거됨

스택 영역의 원리

스택 영역의 원리

  • static
    public class Ex02_MemoryInHeap1{
    	public static void main(String[] args){}
    }
    • JVM은 무조건 메서드 영역 내 스태틱 영역에서 main()메서드를 첫 메서드로 실행시킴
    • 따라서 JVM에 전달한 클래스에는 main()메서드가 반드시 있어야 하고 public으로 접근 가능해야 함
    • 먼저 추려내져야 하는 변수와 메서드가 있다면 static 지시자 표시를 하여 메모리의 특정 영역에 따로, 미리 로딩시켜놓음
    • 스태틱 영역의 변수는 어떤 객체에서도 접근해서 사용 가능하기 때문에 스태틱 변수를 전역 변수라고 부르기도 함
  • 프로그램이 진행됨에 따라 스택 영역에 메서드의 프레임이 쌓이고 그 프레임 안에서 지역 변수들이 생겼다가 사라졌다를 하다가 모든 메서드의 프레임이 스택 영역에서 사라지면 프로그램이 종료

힙 영역의 원리

Book book1 = new Book();
  • 위의 코드가 실행되면 수행되는 동작은 다음과 같음
    1. new 연산자와 Book() 생성자를 이용하여 객체를 힙 영역에 만듦

    2. 객체를 참조할 수 있게 객체를 관리하는 내부적인 표에 자기 위치를 등록시킴 (id - 힙 영역 위치)

    3. 힙 영역Book 객체를 동적으로 만들어 저장함

      (생성되는 객체의 크기는 클래스마다 천차만별이기 때문에 힙 영역에 동적으로 만들어 저장됨)

    4. 스택 영역book1 변수를 만들고, 그 객체를 참조할 수 있는 id값을 대입 받음

      (스택 영역에는 정해진 크기의 값들만 저장됨 ex.id, book1을 참조 변수라고도 함)

 Book book2 = new Book(); 
  • 이렇게 새로운 객체를 생성하면 book1book2는 서로 다른 id값을 참조함
  • 즉, book1book2힙 영역의 서로 다른 객체를 참조함
book1 = null;
  • 스택 영역의 변수와 힙 영역의 객체 간에 참조 관계를 끊어줌
  • 참조 변수에 null을 대입하는 것을 참조를 끊는다고 표현함
  • 참조를 끊을 때 힙 영역의 객체가 바로 사라지는 것은 아님
  • 가비지 컬렉터가 메모리 관리를 위해 수행될 때 힙의 객체를 발견하고, 이 객체를 사용하는 스택 영역의 변수를 찾아보고 아무것도 참조하는 것이 없다고 결론이 나면 그때 자동으로 제거를 하기 위해 제거 표시를 해줌
  • 프로그램이 종료되면 이 프로그램에서 만든 힙 여역의 모든 객체는 자동으로 제거됨
Book book3 = book1;
  • 참조 값을 대입할 경우, 힙 영역에 객체를 새롭게 만드는 것이 아니고, id값이 복사되어 들어감
  • book3book1은 같은 기존 객체를 가리키게 됨
profile
반성은 하되 후회하지 않는다😎

0개의 댓글