Skip to content

Latest commit

 

History

History
109 lines (94 loc) · 5.87 KB

[Java] JVM 메모리 사용 영역.md

File metadata and controls

109 lines (94 loc) · 5.87 KB

JVM 메모리 사용 영역(Runtime Data Area)

Assembled by yunjin (2021-07-15)


⚡ 요약

  • JVM
    - 바이트 코드를 실행시키기 위한 가상머신입니다.
  • 메서드 영역
    - JVM이 구동될 때 생성됩니다.
    - 클래스별로 클래스 정보와 필드와 메소드 데이터, 메소드 및 생성자 코드, 상수가(Static, final, 문자열 상수 String)저장되는 영역이다.
  • 힙 영역
    - 객체와 배열이 생성되는 영역입니다.
    - JVM 스택 영역에서 생성된 변수나 다른 객체의 필드를 해당 영역의 객체와 필드에 참조합니다.
    - GC을 수행합니다.
  • 스택 영역
    - 스레드가 시작될때 할당되며 메서드가 호출되면, 메서드의 매개변수와 지역변수가 저장되는 영역이다.

JDK, JRE, JVM

  • 자바 애플리케이션을 개발하고 실행하기 위한 자바 플랫폼 3대 구성 요소입니다.
  • 자바 개발 도구 (JDK, Java Development Kit)
    - 자바 프로그램에 필요한 JVM, 라이브러리 API, 컴파일러 등 개발 도구가 포함된 소프트웨어 패키지
  • 자바 실행 환경 (JRE, Java Runtime Environment)
    - 자바 프로그램 실행에 필요한 JVM, 라이브러리 API가 포함된 소프트웨어 패키지

JVM

  • 자바 가상 기계 Java Virtual Machine
  • 바이트 코드 파일을 해당 운영체제에서 실행 가능한 기계어로 변역 후 실행할 수 있게 해주는 가상의 운영체제입니다.
  • 메모리 관리 및 Garbage Collection을 수행합니다.

+여기서 잠깐 바이트 코드(Byte Code) 파일이란?

  • .Class 확장자이며 자바 소스 파일을 javac에 의해 컴파일된 파일입니다.
  • 바이트 코드 파일은 운영체제에서 바로 실행할 수 없고, JVM을 통해 번역이 필요합니다.

  • 쓰레기 수집기 Garbage Collection
  • 자바 메모리 관리 기법 중 하나로, 자바에선 JVM GC를 이용해 사용하지 않는 객체를 메모리에서 자동으로 제거해줍니다.

JVM 메모리 구조

jvm

  • java.exe로 JVM이 시작되면 JVM은 운영체제에서 할당받은 메모리 영역(Runtime Data Area)을 다음 아래와 같이 세부 영역으로 구분하여 사용합니다.

메소드(Method) 영역 (Static)

- JVM이 구동될 때 생성되며 모든 스레드가 공유하는 영역
- JVM이 읽어들인 클래스, 인터페이스에 대한 런타임 풀 상수, 메소드와 필드, Static 변수, 메소드 코드, 생성자(Constructor) 코드 등 저장

  • Field Information
    - 멤버변수 접근 제한자, 데이터 타입, 이름에 대한 정보

  • Method Information
    - 메서드 접근 제한자, 리턴타입, 이름, 매개변수에 대한 정보

  • Type Information
    - Type의 속성이 Class인지 Interface인지 여부 저장
    - Type의 전체이름(패키지명 + 클래스명)

  • Static Variable
    - 모든 객체가 공유할 수 있고, 객체 생성없이 접근 가능.

  • constant Pool(상수 풀)
    - Type에서 사용된 상수를 저장하는 곳 (중복이 있을 시 기존 상수 사용)
    - (String)문자 상수, 타입, 필드, Method의 Symbolic reference(객체 이름으로 참조하는 것)도 상수 풀에 저장
    - final class 변수의 경우에도 상수풀 값에 복사

  • +여기서 잠깐 final 변수란?
    - final로 선언된 변수가 할당되면 항상 같은 값을 가진다.

힙(heap) 영역

- 객체와 배열이 생성되는 영역 (참조형 referense type의 데이터 타입을 갖는)
- 해당 영역에 생성된 객체, 배열은 JVM 스택(Stack) 영역에서 생성된 변수나 다른 객체의 필드에서 이 곳에 있는 객체와 배열을 참조한다.
- 참조하는 변수나 필드가 없다면 GC에 의해 자동으로 제거한다.
- 프로그램 실행 중 생성되어 동적할당됨.

  • Young Generation(Eden, surv1, surv2)
    - 생성된지 얼마 안되는 객체가 저장되는 공간
    - 시간이 지남에 따라 우선순위가 낮아지면 Old 영역으로 옮겨진다.
    - 객체가 사라질때 Minor GC 발생

  • Old Generation
    - YG 영역에서 저장된 객체 중 오래된 객체가 이동되어서 저장되는 영역
    - 객체가 사라질때 Major GC(Full GC) 발생

  • Pem(Permanent) 영역
    - Class Loader에 의해 Load되는 class, method 등에 대한 Meta 정보가 저장되는 영역으로, JVM에 의해서 사용됩니다.

  • +여기서 잠깐 필드(field)란?
    - 클래스 내부 멤버입니다. 클래스 안에 독립적으로 선언된 변수입니다. 메소드 밖에 정의됨.
    - 클래스 변수, 멤버 변수라고 함.

  • +여기서 잠깐 동적할당이란?
    - 컴퓨터 프로그래밍 실행 시간 동안 사용할 메모리 공간을 할당하는 것을 말합니다.


JVM 스택(Stack) 영역

- 메서드 안에서 사용되는 값들을 저장 (메서드 정보, 매개변수, 지역변수, 연산 중 발생하는 임시 데이터)
- 메서드 호출 시 생성되는 스레드 수행 정보를 기록하는 프레임(Frame) 생성
- 메스드 수행이 끝나면 프레임(Frame)별로 삭제.
- 메서드를 호출 시 프레임(Frame)을 추가(Push)하고 메서드가 종료되면 해당(Frame)을 제거(Pop)한다.
- 실행 순서에 따라 생성되고 소멸된다. Last In First Out(LIFO) 선입후출 구조