JVM 메모리 할당 방식 / 스프링 관리 객체

Daeun Jung·2022년 7월 12일
0

research

목록 보기
8/10

JVM 메모리 할당 방식

스택 메모리

  • int, boolean과 같은 primitive 타입의 변수들을 저장한다. Integer, Boolean 과 같은 Reference 타입의 변수는 저장하지 못한다. Stack에는 정말 간단한 변수나 Heap을 가리키는 주소값 둘 중 하나만 저장된다.

힙 메모리

  • 객체를 저장하는 가상메모리 공간. Heap에는 복잡한 타입의 변수 클래스 타입, Interface 타입, ArrayType의 변수들이 저장된다. 복잡한 데이터여서 Heap 내부에 Heap를 Reference한다면 Heap의 데이터가 다시 Heap의 데이터를 참조할 수도 있다. new 연산자로 생성되는 객체와 배열을 저장한다. Class Area(Static Area)에 올라온 클래스들만 객체로 생성할 수 있다.
    • heap 메모리는 세 부분으로 나눌 수 있다. Permanent Generation / New/Young Generation / OLD Generation
    • 여기서 Old 영역의 객체들은 추후 가비지 콜렉터에 의해 사라진다. 생명 주기가 긴 “오래된 객체”를 GC 대상으로 하는 영역이다. 여기서 일어나는 가비지 콜렉트를 Major GC 라고 한다. Minor GC에 비해 속도가 느리다. New/Young Area에서 일정시간 참조되고 있는, 살아남은 객체들이 저장되는 공간이다.
    • New/Young 영역의 인스턴스들은 추후 가비지 콜렉터에 의해 사라진다. 생명 주기가 짧은 “젊은 객체”를 GC 대상으로 하는 영역이다. 여기서 일어나는 가비지 콜렉트를 Minor GC 라고 한다.
    • Permanent 영역은 생성된 객체들의 정보의 주소값이 저장된 공간이다. 클래스 로더에 의해 load되는 Class, Method 등에 대한 Meta 정보가 저장된다.
    • Stack은 좁은 메모리 공간이지만, Heap은 넓은 메모리 공간이다. Stack 메모리에 값을 할당하고 해제하는 것은 많은 비용이 들지 않지만, Heap 메모리에 값을 할당하고 해제하는 것은 많은 비용을 요한다. 따라서 너무 Heap에 데이터를 자주 할당하고 해제하는 방식으로 코드를 짠다면 같은 방식을 Stack에 했을 때보다 수십배의 속도 차이가 날 수 있다.
  • 출처

스프링 관리 객체

profile
백엔드 개발자입니다 :)

0개의 댓글