Java/김영한의 실전자바

[김영한의 실전 자바 - 기본편] 자바 메모리 구조

슈코 2024. 1. 21. 21:26

메모리 구조

자바의 메모리 구조는 메서드, 스택,  힙 영역으로 구분할 수 있다.

 

강의 참고자료에 나오는 그림. 한눈에 파악하기 좋아 첨부

 

 

메서드 영역(Method Area)

클래스 영역이라고도 하며, 클래스 레벨의 정보를 저장한다(클래스, 인터페이스, 메서드, static 변수, 상수)

프로그램을 실행하는데 필요한 공통 데이터를 관리

프로그램의 모든 영역에서 공유

  • 클래스 영역 - 모든 실행 코드가 저장되어 있는 공간
  • Static 영역 - static 변수들을 보관
  • 런타임 상수 풀 - 공통 리터럴 상수나 효율적인 관리를 위해 사용하는 상수를 보관

 

프로그램에서 같은 클래스에서 생성되는 객체 A, B가 각각 메소드 a를 호출한다고 생각해보자.

객체마다 같은 메소드인 a를 따로 가지고 있다면, 이는 비효율적인 메모리 구조일 것 이다.

( 100개의 객체가 똑같은 메소드를 각각 가지고 있으면...? )

 

메소드에 해당하는 실행코드는 클래스 영역에 보관되어 있고,

객체는 힙 영역에 생성되고, 메소드 호출 시 클래스 영역의 소스코드를 참조한다.

 

 

static 변수

멤버변수 앞에 static을 붙이면 클래스 변수라고 부른다.

static 변수는 메서드 영역에 딱 한 번만 만들어지고 모든 객체가 공유한다.

공통으로 써야하는 경우(전체 카운트, 상수 값)에 자주 사용된다.

클래스명.static변수 형태로 사용하는것이 좋다

 

 

static 메서드

메서드 앞에 static이 붙으면 클래스 메서드라고 부른다

객체를 만들지 않고 바로 호출할 수 있다(클래스명.메서드() 형태)

인스턴스 변수를 사용할 수 없고, 오직 static 변수만 사용할 수 있다(아직 객체가 없는데, 인스턴스 변수를 쓰는게 더 이상하다)

대신, 파라미터로 받은 객체의 값은 사용할 수 있다

주로 유틸성 메소드(단순 계산, 공통 로직)에 많이 활용된다.

 

 

 

힙 영역(Heap Area)

  • 객체(인스턴스)와 배열이 생성되는 영역
  • GC가 이루어지는 주요 영역

 

스택 영역에 프로그램의 실행 순서대로 쌓이고, 이 안에서 객체가 생성되거나 배열이 생성되는 경우 힙 영역에 생성이 된다.

참조형 변수는 그 값을 보관하고 있는 주소값을 가지고 있는 변수라고 했었는데, 그 주소값들이 여기 힙 영역에 존재한다.

프로그램안에서 참조를 잃게되는 경우, 자바가 해당 인스턴스를 찾아서 삭제하는데 이를 GC(가비지 컬렉션) 이라고 한다.

 

힙 메모리는 프로그램의 실행 도중에 크기가 결정된다(런타임 할당)

개발자가 직접 크기를 바꾸진 않지만, JVM 옵션(-Xms, -Xmx)으로 초기/최대 크기를 조절할 수 있다

 

 

 

스택 영역(Stack Area)

자바 실행 시 하나의 실행 스택을 생성

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

각 쓰레드별로 하나의 실행 스택이 생성된다(스택 영역은 공유되지 않는다)

자바는 스택 영역을 사용해서 메서드 호출과 지역변수(매개변수 포함)를 관리한다

스택 프레임이 종료되면 지역 변수도 함께 제거된다

스택 프레임이 모두 제거되면 프로그램이 종료된다

LIFO(Last In First Out)구조로 가장 마지막에 호출된 메소드가 가장 먼저 종료된다

기본형 변수들은 스택영역에 저장되고, 참조형 변수는 그 참조값(주소값)만 스택영역에 저장된다. 실제 객체는 힙 영역에 존재한다