JAVA, JVM

JVM : 자바 가상 머신

  • 자바(byte 코드)를 실행하기 위한 기계

jvm

특징 - OS에 독립

  • JAVA는 JVM만 있으면 OS에 관계없이 프로그램 실행 가능하다.
  • JVM이 OS에게 메모리 사용권한을 할당받고 JVM이 프로그램을 호출하여 실행한다.
  • JAVA는 OS에 독립적이지만 JVM은 종속적이다
  • C언어는 OS에 독립X

자바 메모리 구조

  • Java source : 자바 코드(ex. Hello.java)
  • Java 컴파일러 : 자바 코드 -> 바이트 코드로 변환 _ Class Loader : Class 파일을 메모리 (Runtime Data Area)에 적재 _ Execution Engine : 바이트 코드를 해석
  • Runtime Data Area : 프로그램 수행하기 위해 OS에서 할당 받은 메모리 공간

jvm메모리 구조

Runtime Data Area

  • 할당 받은 메모리 공간

Method Area

  • JVM의 모든 쓰레드들이 공유하는 데이터 영역
  • (= Class Area, Code Area, Static Area)
  • Field Information : 멤버변수 의 이름, 데이터 타입, 접근 제어자에 대한 정보
  • Method Information : 메서드 의 이름, 리턴타입, 매개변수, 접근제어자에 대한 정보

Heap

  • new 연산자로 생성된 객체와 배열 저장하는 공간
  • Garbage Collection, GC 으로 관리되는 영역
  • Method Area에 로드된 클래스만 생성가능

Perm 영역 java 78 heap

  • JDK 8부터 Permanent Heap 영역이 제거되었다.
    • 대신 Metaspace 영역이 추가되었다.
    • Perm은 JVM에 의해 크기가 강제되던 영역이다.
  • Metaspace는 Native memory 영역으로, OS가 자동으로 크기를 조절한다.
    • 옵션으로 Metaspace의 크기를 줄일 수도 있다.
  • 그 결과 기존과 비교해 큰 메모리 영역을 사용할 수 있게 되었다.
    • Perm 영역 크기로 인한 java.lang.OutOfMemoryError를 더 보기 힘들어진다
  • 저장 정보 : Class의 Meta 정보, Method의 Meta 정보, Static 변수와 상수 정보들이 저장 -> java8 ( Static Object는 Heap 영역으로 옮겨져서 GC의 대상)

https://johngrib.github.io/wiki/java8-why-permgen-removed/

Stack

  • Last In First Out
  • 메서드 호출시마다 각각의 스택 프레임이 생성, 메서드 수행이 끝나면 프레임별로 삭제
  • 호출된 메서드의 매개변수, 지역변수, 리턴 값 및, 연산시 일어나는 값들 등 임시 데이터 저장
  • 쓰레드 별로 별도의 스택을 생성하고 관리
  • 스레드가 필요한 데이터를 저장하기 위해 프레임이라는 영역을 가진다

Native Method Stack

  • 자바 외에 다른 언어에 제공되는 메서들이 저장되는 공간 (자바 프로그램이 컴파일되어 생성되는 바이트 코드 x , 실제 수행 할 수 있는 기계어로 작성된 프로그램을 실행 시키는 영역)

PC Register

  • 다음 실행될 명령어가 있는 주소 저장

참고

Tags:

Categories:

Updated: