본문 바로가기

프로그래밍언어/Java

[Java 기본] 자바 메모리 구조

자바 메모리 구조


자바 메모리 구조는 크게 메서드 영역, 스택 영역, 힙 영역 3개로 나눌 수 있다. 

 

  • 메서드 영역: 클래스 정보를 보관한다. 
  • 스택 영역: 실제 프로그램이 실행되는 영역이다. 메서드를 실행할 때 마다 하나씩 쌓인다. 
  • 힙 영역: 객체가 생성되는 영역이다. new 명령어를 사용하면 이 영역을 사용한다. 

 

 

영역 별로 더 자세히 알아보자. 


메서드 영역: 프로그램을 실행하는 필요한 공통 데이터를 관리한다. 프로그램의 모든 영역에서 공유한다. 

 - 클래스 정보 : 클래스의 실행 코드(바이트 코드), 필드, 메서드와 생성자 코드등 모든 실행 코드가 존재한다. 자바가 처음 실행될 때 클래스 정보를 읽어서 메서드 영역에 올리는 것이다. 

 - static 영역 : static 변수들을 보관한다. 

 - 런타임 상수 풀 : 프로그램을 실행하는데 필요한 공통 리터럴 상수를 보관한다.  

 

스택 영역: 자바 실행 시, 하나의 실행 스택이 생성된다. 처음에는 메인메서드가 들어갈 것이다. 만약 메인 메서드에서 다른 메서드를 호출한다면 메인메서드 위에 스택프레임이 들어가게 된다. 

각 스택 프레임은 지역 변수, 중간 연산 겨로가, 메서드 호출정보 등을 포함한다. 

메서드가 실행되면 하나의 스택 프레임이 쌓이고, 메서드가 종료되면 스택프레임이 제거된다. 

 

힙 영역: 객체(인스턴스)와 배열이 생성되는 영역이다. 가비지 컬렉션(GC)이 이루어지는 주요 영역이며, 더이상 참조되지 않는 객체는 GC에 의해 제거된다 .

 

메서드 코드는 메서드 영역에


자바에서 특정 클래스로 100개의 인스턴스를 생성하면, 힙 영역에 100개의 인스턴스가 생긴다. 각각의 인스턴스는 내부에 변수와 메서드를 가진다. 같은 클래스로부터 생성된 객체라도, 인스턴스 내부의 변수 값은 서로 다를 수 있지만, 메서드는 공통된 코드를 가지고 있다. 

=> 인스턴스를 생성하더라도 인스턴스마다 다른 메서드를 가져갈 필요는 없다. 따라서 객체가 생성될 때, 인스턴스 변수에는 메모리가 할당되지면, 메서드에 대한 새로운 메모리 할당은 없다. 메서드는 메서드 영역에서 공통으로 관리하고 실행된다. 

 

 

 

* 인프런 '김영한의 실전 자바 - 기본편'을 참고하여 작성하였습니다.