[TIL] 2024-12-09_자바 메모리 구조

Yuri·2024년 12월 9일

TIL

목록 보기
3/59
post-thumbnail

📕 Today I Learned - 오늘 내가 공부한 것을 정리합니다.

1. 자바 메모리 구조

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

  • 메서드 영역: 프로그램을 실행하는데 필요한 공통 데이터 관리, 프로그램의 모든 영역에서 공유
    • 클래스 정보: 클래스의 실행코드(바이트 코드), 필드, 메서드의 생성자 코드 등
    • static 영역: static 변수들을 보관
    • 런타임 상수 풀: 프로그램을 실행하는데 필요한 공통 리터럴 상수 보관
  • 스택 영역: 자바 실행 시, 하나의 실행 스택 생성. 각 스택 프레임은 지역 변수, 중간 연산 결과, 메서드 호출 정보 등을 포함
    • 스택 프레임: 메서드를 호출할 때마다 하나의 스택 프레임이 쌓이고, 메서드가 종료되면 해당 스택 프레임이 제거됨
  • 힙 영역: 객체(인스턴스)와 배열이 생성되는 영역. 가비지 컬렉션(GC)이 이루어지는 주요 영역이며, 더 이상 참조되지 않는 객체는 GC에 의해 제거

💡 참고: 스택 영역은 각 쓰레드별로 하나의 실행 스택이 생성된다. 따라서 쓰레드 수 만큼 스택 영역이 생성된다.

메서드 영역

각각의 인스턴스는 내부에 변수와 메서드를 가진다.
같은 클래스로 부터 생성된 객체라도, 인스턴스 내부의 변수 값은 서로 다를 수 있지만, 메서드는 공통된 코드를 공유한다. 따라서 객체가 생성될 때, 인스턴스 변수에는 메모리가 할당되지만, 메서드에 대한 새로운 메모리 할당은 없다.

→ 메서드는 메서드 영역에서 공통으로 관리되고 실행된다.

스택 영역

메서드 호출지역 변수(매개변수 포함)를 관리하는 영역

  • 메서드를 계속 호출하면 스택 프레임이 계속 쌓인다.
  • 스택 프레임이 종료되면 지역 변수도 함께 제거된다.
  • 스택 프레임이 모두 제거되면 프로그램도 종료된다.

힙 영역

스택 영역의 메서드에서 클래스의 인스턴스를 생성하는 순간 힙 영역에 해당 클래스의 인스턴스를 생성한다. 그리고 참조값을 스택 영역의 지역 변수에 보관한다. 스택 영역의 메서드가 종료되어 스택 프레임이 제거되고 참조값을 보관한 지역 변수도 함께 제거된다.
이 때, 프로그램에서 더 이상 참조하는 곳이 없다면 GC(가비지 컬렉션)이 해당 인스턴스를 찾아 메모리에서 제거한다.

2. static

static 변수

  • 클래스 변수, 정적 변수, static 변수 등으로 부른다. (용어를 모두 사용하니 주의)
  • static이 붙은 멤버 변수는 인스턴스와 무관하게 클래스에 바로 접근해서 사용할 수 있고, 클래스 자체에 소속되어 있다.
  • 자바 프로그램을 시작할 때 딱 1개가 생성됨. 인스턴스와는 다르게 보통 여러곳에서 공유하는 목적으로 사용

static 변수 / 인스턴스 변수

힙 영역에 생성되는 인스턴스 변수는 동적(dynamic)으로 생성되고, 제거된다. 반면에 static 인 정적 변수는 거의 프로그램 실행 시점에 딱 만들어지고, 프로그램 종료 시점에 제거된다. 정적 변수는 이름 그대로 정적이다.

  • static 변수: 메서드 영역의 static 영역. 클래스를 통해 접근
int value = Data.value;
  • 인스턴스 변수: 힙 영역. 인스턴스를 생성하여 인스턴스를 통해 접근
Data data = new Data();
int value = data.value;

static 메서드

  • static이 붙은 메서드 → 클래스에 바로 접근해서 사용
  • 클래스 메서드, 정적 메서드, static 메서드등으로 부른다.
  • 객체 생성이 필요 없이 메서드의 호출만으로 필요한 기능을 수행할 때 주로 사용한다.

main() 메서드

main() 메서드는 프로그램을 시작하는 시작점이 되는데 객체를 생성하지 않아도 작동하는 이유는 main() 메서드가 static 이기 때문이다.

public static void main(String[] args) {}

→ 정적 메서드인 main() 메서드가 같은 클래스에서 호출하는 메서드도 정적 메서드로 선언해서 사용


💭 혈당 스파이크가 심하게 와서 공부에 방해되었다.😪 롱런할 수 있도록 식습관에도 주의를 기울여야겠다.

profile
안녕하세요 :)

0개의 댓글