Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

To Dare Is To Do!

자바 메모리 구조 (feat 자바 변수) 본문

Java

자바 메모리 구조 (feat 자바 변수)

Nick_Choi 2024. 6. 12. 14:53

이전에 자바의 컴파일 과정에 대해 정리해본 글을 살펴보면

JVM의 클래스 로더는 자바 컴파일러가 컴파일한 클래스 파일(바이트 코드)를 동적 로딩의 과정을 통해여 JVM의 메모리(Runtime Data Area)에 적재한다.

https://whitehartlane.tistory.com/23

 

자바의 컴파일 과정과 JVM

자바의 컴파일 과정1. 개발자가 자바 소스코드(.java)를 작성2. 작성된 자바 소스코드는 자바 컴파일러의 컴파일 과정을 통해 자바 바이트 코드(.class)*로 변환됨3. 컴파일된 바이트 코드는 JVM의 클

whitehartlane.tistory.com

 

Runtime Data Area의 메모리 영역에 대해 간단히 살펴보았지만 이번 글에서는 자바 프로그램이 실행될 때 주로 사용되는 메모리 영역 부분을 다시 정리하여 자바의 메모리 구조를 공부하고자 한다.

 

자바 프로그램이 실행되면 데이터 타입에 따라 JVM의 메모리 공간 중 Method (Static)영역, Stack 영역, Heap 영역으로 구분되어 할당된다.

 

각 메모리 영역에 대해 자세히 살펴보기 전에 자바의 변수에 대해 가볍게 살펴보도록 한다.

 

자바 변수

자바에서 선언 위치에 따라 변수의 종류가 구분되는데 크게 클래스 변수, 인스턴스 변수, 지역 변수, 매개 변수가 있다.

변수명 설명 생성 시기 선언 위치
클래스 변수
(static 변수)
- 클래스 영역에서 타입 앞에 static이 붙는 변수
- 객체를 공유하는 변수로 여러 객체에서 공통으로 사용하고 싶을 때 정의함
클래스가
메모리에
올라갈 때
클래스 영역
인스턴스 변수 - 클래스 영역에서 static이 아닌 변수
- 개별적인 저장 공간으로 객체/인스턴스마다 다른 값을 저장 가능
인스턴스 생성 시
지역 변수 - 매서드 내에서 선언되고 메서드 수행이 끝나면 소멸
되는 변수
- 초기값을 지정해야 사용할 수 있음
위치하는 메서드
수행 시
매서드 영역
매개 변수
(parameter)
- 매서드 호출 시 전달하는 값을 가지고 있는 인수
(지역 변수와 마찬가지로 선언된 곳부터 수행이 끝날 때까지만 유효)

*출처 Inpa.tistory.com

 

다시 돌아와 자바의 메모리 구조를 살펴보자

 

Method (Static) 영역

  • JVM의 클래스 로더가 클래스 파일을 로딩할 때 생성되는 영역
  • 클래스와 인터페이스에 대한 런타임 상수 풀, 필드(멤버 변수), 클래스 변수(static 변수), 상수(final), 생성자, 메서드 등을 저장한다.
  • 해당 영역에 있는 데이터는 어느 곳에서나 접근이 가능하다.
  • 해당 영역의 데이터는 프로그램이 시작될 때부터 종료될 때까지 메모리에 존재한다.
  • => static 메모리의 데이터들은 프로그램이 종료될 때까지 어디서든 사용이 가능하지만 무분별한 사용은 메모리 부족 현상을 초래할 수 있다.

Stack 영역

  • 메서드 내에서 정의된 기본 자료형에 해당되는 지역변수의 데이터 값이 저장되는 영역
  • primitive 타입의 데이터(int, double, byte, long, boolean 등) 에 해당되는 지역변수, 매개 변수 데이터 값들이 저장
  • 메서드가 호출될때 스택 영역에 스택 프레임*이 생기고 그 안에 메서드를 호출
  • 메서드가 호출 될 때 메모리에 할당되고 메서드가 종료되면 메모리에서 사라짐
  • Stack 은 후입선출 LIFO(Last-In-First-Out) 의 특성을 가지며, 스코프(Scope) 의 범위를 벗어나면 스택 메모리에서 사라진다.

*스택 프레임

하나의 메서드에 필요한 메모리 덩어리를 묶어서 스택 프레임(Stack Frame)이라고 한다.

하나의 메서드당 하나의 스택 프레임이 필요하며, 메서드를 호출하기 직전 스택프레임을 자바 Stack에 생성한 후 메서드를 호출하게 된다.

스택 프레임에 쌓이는 데이터는 메서드의 매개변수, 지역변수, 리턴값 등이 있다.만일 메서드 호출 범위가 종료되면 스택에서 제거된다.

*출처 Inpa.tistory.com

 

Heap 영역

  • JVM이 관리하는 프로그램 상에서 데이터를 저장하기 위해 런타임 시 동적으로 할당하여 사용하는 영역
  • 참조형(Reference Type) 데이터 타입을 갖는 객체(인스턴스), 배열 등이 저장 되는 공간
  • 단, Heap 영역에 있는 오브젝트들을 가리키는 레퍼런스 변수는 stack에 적재
  • Heap 영역은 Stack 영역과 다르게 보관되는 메모리가 호출이 끝나더라도 삭제되지 않고 유지된다.
  • 그러나 어떤 참조 변수도 Heap 영역에 있는 인스턴스를 참조하지 않게 된다면, GC(가비지 컬렉터)에 의해 메모리에서 청소된다.
  • stack은 스레드 갯수마다 각각 생성되지만, heap은 몇개의 스레드가 존재하든 상관없이 단 하나의 heap 영역만 존재

 


https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EA%B7%B8%EB%A6%BC%EC%9C%BC%EB%A1%9C-%EB%B3%B4%EB%8A%94-%EC%9E%90%EB%B0%94-%EC%BD%94%EB%93%9C%EC%9D%98-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%98%81%EC%97%AD%EC%8A%A4%ED%83%9D-%ED%9E%99

 

☕ 그림으로 보는 자바 코드의 메모리 영역(스택 & 힙)

자바의 메모리 영역 이번 포스팅에선 자바(JAVA)를 사용하는 입장에서 알아야 할 메모리 구조 및 특징에 대해서 알아보려고 한다. 자바 프로그램이 실행되면 JVM(자바 가상 머신)은 OS로부터 메모

inpa.tistory.com

 

'Java' 카테고리의 다른 글

thread  (0) 2024.07.05
오버로딩과 오버라이딩  (0) 2024.07.04
JVM과 자바의 컴파일 과정  (0) 2024.06.11
클래스를 왜 쓰는지 다시 한번 생각해 보자!  (0) 2023.12.21
인터페이스가 가지는 객체 지향의 특징  (0) 2023.10.21