첫 주 마무리

피오·2021년 11월 7일
0
post-thumbnail

JVM 메모리 구조

간단히 세 가지 영역만 구분해서 정리해보았다

Method Area

  • JVM이 시작될 때 생성되어 프로그램이 종료될 때까지 유지되는 메모리 공간이다.
  • JVM이 구동될 때 생성되며 모든 스레드가 공유하는 영역이다.
    • 스레드 간에 공통적으로 사용될 데이터를 static 변수로 선언하면 메서드 영역에 단 한 번만 생성하여 공유할 수 있기 때문에 메모리를 아낄 수 있다.
  • JVM이 자바 코드를 실행하기 위해 필요한 중요 정보들을 저장하고 있다.
    • 실행환경 상수 풀(Run-time Constant Pool)
    • field 정보(멤버변수 이름, 데이터 타입, 접근 제어자 등의 정보)
    • class 정보(무슨 정보?)
    • method 정보(메서드 이름, 리턴타입, 매개변수, 접근제어자 등의 정보)
    • interface 정보
    • 생성자 정보
    • 정적(static) 변수에 대한 정보

Stack Area

  • 메서드를 하나 호출할 시 statck 메모리 영역에 stack frame이 하나 생성되고, 메서드가 종료되면 해당 stack frame은 사라진다(LIFO 순서대로).

  • LIFO순으로 메모리가 쌓이기 때문에 stack에 새로 생성될 공간의 주소값은 이전 저장 공간의 주소값보다 작다.
    ex)
    | 0x996 |
    | 0x1000 |
    | 0x1004 |

  • Stack Frame의 구성요소

    1. 지역변수가 배열 형태로 존재한다. 메서드에 넘어온 매개변수도 지역변수이다.
      메서드 내부의 지역변수의 수명주기는 stack frame의 생명 주기와 동일하다.
    2. Operand Stack. 메서드 내부에서 연산되는 '값'들이 임시로 저장되는 공간이다. 지역변수에 값을 할당할 때 operand stack에 값들이 push되었다가 연산 후 pop되어 할당된다.
  • 메서드가 무한히 호출되어 stack 메모리 영역의 데이터가 꽉차면 stack overflow가 뜬다.

Heap Area

  • new 연산자로 생성된 인스턴스나 문자열 상수가 저장됨(heap 영역 내에 따로 상수 pool이 존재).
  • heap에 올라간 인스턴스나 문자열 상수 중에 참조 되고 있지 않은 것들이 있다면 garbage collector가 수집하여 스케줄링에 의해 메모리에서 해제된다.


클래스와 객체(인스턴스)

차이점

  • 클래스는 생성할 객체의 설계도라 할 수 있고, 객체(인스턴스)란 해당 설계도에 따라 실제로 만들어진 실체이다.

객체의 수명

  1. Created
    Heap 영역에 객체 저장 공간을 할당후 Super class의 생성자 호출을 통해 초기화를 수행.

  2. In use or reachable(사용중)
    생성된 인스턴스가 참조되고 있는 상태.

  3. Invisible(사용중이나 접근불가)
    향후 정리

  4. Unreachable(미사용중)
    인스턴스가 어디에서도 참조되고 있지 않을 때 Garbage Collecting의 후보가 된다. GC의 후보라고 해서 바로 수집되는 건 아니고, 일단 GC 대상 Queue에 등록된다.

  5. Collected(GC 대상이 된 상태)
    메모리 해제단계의 도입부. Garbage Collector가 객체의 finalize()가 정의되어 있는지 판단하고, finalize가 있다면 finalizer라는 queue에 넣고, 없다면 다음 단계인 finalized 상태로 전환 시킨다.

  6. Finalized(Finalize를 거친 상태)
    finalizer의 Queue에 있다가 finalizer에 의해 finalize가 실행된 후의 상태이다. finalize의 호출 시점은 정확히 알기 어렵고 JVM마다 수행시간도 다르다.

  7. Deallocated(메모리가 해제된 상태)
    GC의 작업이 마무리되어 메모리 반환이 끝난 상태.



Garbage Collector



인터페이스


참고

profile
블로그 이전했습니다. https://pzbg.tistory.com/

0개의 댓글