본문 바로가기
CS 지식

[CS 스터디 질문] 자바의 메모리 & 변수

by CSEGR 2024. 9. 5.
728x90

✔️ 자바의 메모리 모델 

java.exe가 실행되면 자바 가상 머신이 만들어진다. 이때 자바는 메모리 공간의 효율성을 높이기 위해 자바의 사용에 맞게 메모리 공간을 여러 영역으로 나눈다.

 

자바 프로그램이 확보한 메모리 영역은 크게 메서드(method) 영역, 스택(stack) 영역, 힙(heap) 영역 으로 구분하여 사용한다.

 

➕ 메서드(Method) 영역 = Static 영역 - 모든 스레드가 공유해서 사용하는 영역

  • 프로그램 실행에 대한 코드, 정적(static) 변수 및 메서드, 생성자, 런타임 상수 풀 등이 메서드 영역에 생성된다. 
    • 런타임 상수 풀 : 리터럴 상수나 메서드 및 필드 참조 등의 정보가 저장되는 테이블
  • 프로그램 시작 전에 로드되고 프로그램 종료 시 소멸된다. 
  • JVM에 의해 하나만 존재하며, 공유 메모리 영역으로 모든 스레드가 공유합니다.

 

➕ 힙(Heap) 영역 - 모든 스레드가 공유해서 사용하는 영역

  • new 연산자를 통한 참조형 데이터 타입(String, 배열, enum, class, interface), 클래스의 객체(인스턴스)이 힙 영역에 동적으로 생성된다. 
  • new 키워드로 인스턴스를 생성할 때, Heap 영역에는 생성된 객체가 저장되고, Stack 영역에는 생성된 객체에 대한 주소 값(reference, 힙 영역 주소)이 저장된다. 

출처 : https://lucas-owner.tistory.com/38

 

String name = "riley";
  • "riley" 문자열 객체는 Heap 영역에, 변수 name 는 Stack 영역에 저장한다.(name 은 Heap 영역의 "riley" 문자열 객체를 참조하는 참조 값(주소)을 저장)
  • 모든 스레드가 공유하는 영역이다. 
  • 생성된 객체는 자동 저장소 관리 시스템인 Garbade Collector에 의해 사용이 없음이 확인되면 자동으로 제거된다. 
  • 즉, 자바는 자동으로 메모리 관리가 가능함. 

 

➕ 스택(Stack) 영역 - 스레드마다 하나씩 생성

  • 각 스레드마다 별도로 할당되는 영역으로, 메서드 호출 시 사용되는 지역 변수, 매개변수, 기본 자료형(Primitive type: int, double,boolean,byte)가 프레임 형태로 생성되어 저장된다. 
  • 프레임 영역을 벗어난 다른 메서드의 변수들은 서로 참조할 수 없다. 
  • Heap 영역에 생성된 데이터의 참조값(주소)이 할당된다.
  • 메서드가 호출될 때마다 새로운 스택 프레임이 생성되고, 메서드가 종료되면 해당 프레임이 제거됩니다.

✔️ 운영체제 메모리 구조? 자바 메모리 구조?

저번 포스팅에서 메모리 구조는 코드(code), 데이터(data), 힙(heap), 스택(stack) 4개의 영역으로 나뉜다고 하였다. 

 

[운영체제] 메모리 구조

이번 포스팅에서는 메모리 구조에 대해서 상세하게 알아보자 ! ▸ 메모리의 구조를 영역에 따라서 설명▸ 힙(Heap) 영역과 스택(Stack) 영역 차이▸ 메모리의 힙 영역을 너무 크게 잡으면? ✔️ 메

cse-gr.tistory.com

 

근데 자바는 메모리를 3가지 영역으로 나눈다. 이 이유에 대해서 알아보겠다. 

자바는 프로그램을 실행하게 되면 JVM(Java Virtual Machine)은 OS로 부터 메모리를 할당 받는다. 

JVM은 할당 받은 메모리를 자바 프로그램에 맞게 여러 개의 영역으로 나누어 사용하게 된다. 

 

왜 OS 메모리 구조와 다르게 영역을 나누는가?

  1. JVM의 필요에 맞춘 추상화 :
    자바는 운영체제에 종속되지 않고, JVM 위에서 동작한다. 이를 위해 JVM이 자체적으로 메모리 관리를 하며, 운영체제 메모리 구조와는 다른 구조로 메모리를 나눈다. 자바는 운영체제와 상관없이 JVM 위에서 코드가 동작해야 하기 때문에, 운영체제나 하드웨어에 의존적인 메모리 구조 대신 JVM 내부에서 메모리 구조를 추상화하여 관리한다. 

  2. 메모리 관리의 자동화 : 
    자바는 가비지 컬렉션을 사용하여 힙 메모리를 자동으로 관리한다. 하지만 운영체제 메모리 구조에서는 사용자가 직접 메모리를 할당하고 해제해야 한다. 이러한 자동 메모리 관리 덕분에 자바는 메모리 영역을 더 세밀하게 구분할 필요가 없어졌다. 

 

✔️ Java의 변수 종류

변수는 선언 위치에 따라 구분짓게 된다.

4가지의 종류가 존재하다 (클래스 변수, 인스턴스 변수, 지역변수, 매개변수)

public class Variable { 

	public static int age = 20; // 클래스 변수(전역 변수)
    
    int height = 60; // 인스턴스 변수(전역 변수)
    
    public static void main(String[] args) { // 매개변수(파라미터)
 		int size = 50; // 지역변수
    }
}
변수 종류 선언 위치 설명 생성 시기 소멸 시기 저장 메모리
클래스 변수
(Static Variable)
클래스 영역  static 키워드가 붙고 여러 객체에서 공통으로 사용할 때 클래스가 메모리에 올라갈 때 프로그램 종료시 Method(static)
인스턴스 변수
(Instance Variable)
클래스 영역에서 static이 아닌 변수 인스턴스가 생성 시 인스턴스 소멸 시  Heap
지역 변수
(Local Variable) 
메서드 영역  메서드 내부에서 선언된다. 초기 값을 지정해야 사용 가능 함수 블록 내에서 변수의 선언문이 실행될 때 함수 종료시 Stack

 

 

 

 

# 참고

https://lucas-owner.tistory.com/38

https://goldenrabbit.co.kr/2021/11/03/%EC%9E%90%EB%B0%94-%EC%BD%94%EB%93%9C%EC%99%80-%EB%A9%94%EC%84%9C%EB%93%9C-%EC%8A%A4%ED%83%9C%ED%8B%B1-%EB%B3%80%EC%88%98-%EB%93%B1%EC%9D%80-%EB%A9%94%EB%AA%A8%EB%A6%AC%EC%9D%98-%EC%96%B4%EB%94%94/

728x90

'CS 지식' 카테고리의 다른 글

VPN이란? IPsec VPN vs SSL VPN  (0) 2025.04.04
[CS 스터디 질문] 컴파일(Compile), 런타임(Runtime)  (1) 2024.09.12