TIL

TIL 2일차

Choony 2025. 1. 22. 14:14

Heap 영역과 Stack영역의 차이

 

Heap 영역의 역할은 다음과 같다.

  • 동적으로 생성된 객체와 배열을 저장

 

Heap 영역의 특징은 다음과 같다.

  • 객체와 배열은 생성후 Heap 영역에 저장된다.
  • 메모리 크기가 상대적으로 크며, 객체는 프로그램이 실행되는 동안 참조될 수 있다.
  • GC(가비지컬렉션)에 의해 자동으로 관리되며, 사용하지 않는 객체는 제거한다.
  • 전역적이고 여러 스레드가 같은 Heap 메모리를 접근할 수 있다.

Heap 영역의 장점은 다음과 같다.

  • 동적 메모리 할당으로 유연성이 높다.
  • 프로그램 실행중에 필요한 메모리만큼 메모리를 할당할 수 있다.

 

Heap 영역의 단점은 다음과 같다.

  • GC로 인해 성능저하가 발생할 수 있다.
  • 메모리 접근 속도가 Stack 보다 느리다.

Stack 영역의 역할은 다음과 같다.

  • 메서드 호출 시 사용되는 지역변수, 매개변수, 메서드 호출 스택 프레임을 저장한다.

Stack 영역의 특징은 다음과 같다.

  • 메서드가 호출되면 Stack 프레임이 생성되고, 메서드가 종료되면 해당 프레임이 제거된다.
  • 메모리 할당/해제가 빠른편이다.
  • 각 스레드마다 독립적인 Stack을 가진다.

Stack 영역의 장점은 다음과 같다.

  • 메모리 접근 속도가 매우 빠르다.
  • 정적 구조로 관리가 간단하며, GC의 영향을 받지 않는다.

Stack 영역의 단점은 다음과 같다.

  • 메모리 크기가 제한적이다.
  • 고정된 크기만큼 메모리를 할당받아 유연성이 부족하다.

 

그래서 왜 이 둘을 따로 관리하고 각각 저장하는걸까?

 

성능 최적화

  • Stack은 크기가 작고, 데이터가 일정하게 생성/삭제 되므로 고속처리가 가능하다.
  • Heap은 큰 데이터를 저장하고 동적 할당이 필요하지만, GC로 관리되므로 메모리 사용이 최적화된다.

데이터 생명주기

  • Stack은 짧은 생명주기(Ex. 지역변수)를 가진 데이터에 적합하다. 
  • Heap은 긴 생명주기(Ex. 객체)를 가진 데이터에 적합하다.

스레드간 데이터 격리

  • 각 스레드는 고유한 Stack 영역을 가진다. 
  • 스레드는 Heap 영역을 공유하여 사용한다. 

static 변수는 JVM 메모리 구조중 어디에 위치할까?

 

static 변수는 JVM 메모리 구조중 메서드 영역에 저장된다.

이는 클래스가 처음 로드되는 시점에 단 한번 메모리에 할당되게 된다. (프로그램 종료 전까지 메모리에 위치하게 된다.)

 

static 변수는 메서드 영역에 위치하며 클래스의 모든 인스턴스와 공유된다.


JVM의 구조

 

JVM이 계속 언급돼서 그런지 구조가 궁금해졌다. - 그건 내일 배운다고한다.