본문 바로가기
Java

JAVA 메모리 구조

by 차가운개발 2024. 9. 19.

 

자바의 메모리 크게 3가지로 나눌 수 있고 간단하게 설명하면 아래와 같다.

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

 

ㅇ 자바의 메모리 구조

출처: https://hstory0208.tistory.com/entry/Java-JVM-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0-%ED%8C%8C%ED%97%A4%EC%B3%90-%EB%B3%B4%EA%B8%B0-Static-Stack-Heap

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

    클래스 정보: 클래스의 실행 코드(바이트코드), 필드, 메서드, 생성자 등 모든 실행 코드가 존재한다.
    Static 영역: static 변수들을 보관한다.
    런타임 상수 풀: 공통 리터럴 상수를 보관한다. 리터럴 문자가 있으면 공통으로 묶어서 관리하고, 이 외에 프로그램을 효율적으로 관리하기 위한 상수를 관리한다.
  • 스택 영역(Stack Area)
    자바 실행 시, 하나의 실행 스택이 생성된다.(멀티 쓰레드 환경에서는 쓰레드의 수 만큼 스택영역이 생성된다.) 각 스택 프레임은 지역 변수, 중간 연산 결과, 메서드 호출 등의 정보를 포함한다. 후입선출 (LIFO, Last In First Out) 구조다.

    스택 프레임: 스택 영역에 하나 씩 쌓이는 박스라고 생각하면 된다. 메서드를 호출할 때 마다 하나의 스택 프레임이 쌓
    이고, 메서드가 종료되면 해당 스택 프레임이 제거된다.  

  • 힙 영역(Heap Area)
    객체(인스턴스)와 배열이 생성되는 영역이다. 가비지 컬렉션(GC)으로 메모리가 관리되는 영역이며, 더 이상 참조되지 않는 객체들은 가비지 컬렉션에 의해 제거된다.

* 만약 같은 클래스로 100개의 인스턴스를 생성한다면?

힙 메모리의 100개의 인스턴스가 생성된다. 각각의 인스턴스 내부의 변수의 값은 다 다를 수 있기 때문에 메모리가 할당되지만, 메서드 같은 경우 100개를 생성하더라도 그 내용은 똑같기 때문에 메서드 영역에서 공통으로 관리 되고 실행된다. 따라서 메서드에 대한 새로운 메모리 할당은 없다. 인스턴스의 메서드를 호출하면 메서드 영역에 있는 코드를 불러서 수행한다.

 

ㅇ 스택 구조 알아보기

스택 구조를 직접 확인해보기 위한 코드를 작성한다.

 

코드를 확인해보면 메서드의 실행순서는 

main() → method1() → method2()라는 걸 확인할 수 있다.

각각의 메서드는 스택 프레임이 생성이 되고 스택 프레임 안에는 매개변수를 포함한 지역변수들이 포함된다.

스택은 후입선출 구조라고 앞에서 말했듯이 실행순서의 역순으로 종료가 된다.

method2() → method1() → main()의 순으로 종료가 되는 걸 콘솔 창을 통해서 확인할 수 있다.

 

정리

  1. 자바는 스택 영역에서 메서드 호출과 지역변수(매개변수 포함)을 관리한다.
  2. 메서드를 호출할 때 마다 스택 프레임이 생성되고 쌓인다.
  3. 스택 프레임이 종료(메서드 종료)되면 지역 변수도 함께 제거된다.
  4. 스택 프레임이 모두 종료되면 프로그램도 종료된다.

 

'Java' 카테고리의 다른 글

JAVA Array(배열)  (4) 2024.10.02
JAVA 변수  (1) 2024.09.19
JAVA 캡슐화(Encapsulation)  (1) 2024.09.18
Java 인터페이스와 추상 클래스의 차이점  (1) 2024.02.28
Java 컴파일 과정을 알아보기  (1) 2024.02.25