[java] Java Virtual Machine

happiyoung_·2024년 8월 13일

java

목록 보기
5/9

Intro

컴파일된 코드는 JVM에 의해서 실행되며, 하드웨어와 운영체제 기반의 이진형태로 사용된다.
이는 클래스 형식으로 파일에 저장된다.

JVM은 데이터 타입체킹을 진행하며, primitive 타입과 Reference 타입이 있다.

primitive type

  • boolean
  • numeric
  • returnAddress

Reference type

  • class
  • array
  • interface

Run-Time Data Areas

런타임 데이터 영역은 프로그램의 실행동안 다양한 런타임 데이터 영역을 정의한다.

  • 일부 데이터 영역은 시작 초반에 생성되고 JVM이 종료되는 시점에 사라진다.
  • 일부 데이터 영역은 스레드 별로 만들어지며, 스레드 생명주기에 맞춰 생겨나고 사라진다.

PC Register

JVM은 실행중에 많은 스레드를 지원하며, 스레드 별로 각각의 PC 가 존재한다.

스레드별로 하나의 메소드가 작동중임을 의미

JVM Stack

JVM의 스레드는 개별의 스택을 가진다. 스택은 프레임을 저장하며 스택에는 지역변수partial 결과 를 가진다.

  • JVM의 스택은 PUSH POP 프레임을 제외하고 직접적으로 이용되진않는다.
  • 프레임들을 힙에서 할당된다.
  • 연속적일 필요는 없다.

exceptional condition

  • 스레드에서의 계산이 더큰 JVM 스택을 요구한다면(허용치보다 더 큰), JVM은 StackOverflowError 를 던진다.
  • JVM 스택이 동적으로 확장될수있다면, 확장이 시도되나 충분한 메모리로 확장에 영향을 준다. 이때 JVM은 OutOfMemoryError 를 던진다.

JVM Heap

JVM은 모든 쓰레드들끼리 공유하는 heap영역을 가진다.

  • 힙은 런타임 데이타 영역으로 모든 클래스 인스턴스와 배열이 할당되는 공간이다.
  • 힙은 vm이 시작될때 만들어지며 힙공간의 객체들은 자동 저장소 관리 시스템에 의해 관리된다. (가비지 컬렉터)
  • 힙은 고정된 크기지만 요구에 의해 확장되기도 하며, 불필요한 경우 줄어들기도 한다.

exceptional condition

  • 계산이 저장소 관리 체계에 의해 만들어진 이용가능한 공간볻 더 큰 공간을 요구한다면 JVM은 OutOfMemoryError 를 던진다.

Method 영역

메소드 영역은 모든 JVM 스레드들 간에 공유되는 공간으로 컴파일된 코드가 저장되어있다. (TEXT)

  • 클래스별로 구조를 저장한다.
  • VM 시작 단계에서 만들어진다.
  • 논리적으로는 힙의 일부지만 간단한 구현들이라 가비지 컬렉이나 축소할 필요가 없다.
  • 메모리의 연속할당부분은 아니다.

exceptional condition

  • 메소드 영역에서 메모리는 할당 요구를 만족시키지 못한다면, JVM은 OutOfMemoryError 를 던진다.

Run-Time Constant Pool

클래스나 인터페이스 별로 있는 런타임이다.

  • 여러 종류의 상수를 포함한다.
  • 컴파일 시간에 결정되는 numeric literals 에서부터 런타임시간에 결정되는 레퍼런스까지 포함한다.
  • 주로 메서드 영역에 할당되며, 클래스나 인터페이스가 생성될때 만들어진다.

exceptional condition

  • 클래스나 인터페이스를 만들때 run-time constant pool의 생성이 메서드 영역의 범위보다 더 많은 메모리를 요구한다면, JVMDMS OutOfMemoryError 를 던진다.

Native Method Stacks

Native Method : 프로세서에 의해 실행되는 JAVA 구현을 위한 바이너리 데이타 (C언어와 같은)

이 영역은 스레드 별로 할당되며, 고정된 크기 동적인 크기 두가지 모두 가능하다.
만일 고정된 크기라면 각 영역의 크기는 스택이 만들어 질때 독립적으로 골라진다.

exceptional condition

  • 스레드에서 계산이 허용된 것 이상으로 더 큰 영역을 필요로 한다면, JVM은 StackOverflowError 를 던진다.
  • 본 영역이 동적으로 확장되는 경우, 스택의 확장이 시도 되었으나 메모리가불충분한 경우, 불충분한 메모리로 인해 새로운 스레드를 위한 새로운 영역이 만들어 질수 없는 경우에 JVM은 OutOfMemoryError 를 던진다.

Frames

프레임은 데이타 혹은 부분적인 결과들을 저장하기위해 사용되는 것이다.

  • 동적 링킹
  • 메서드의 리턴 값
  • 예외 적용

새로운 프레임은 메서드가 불릴때마다 생성되고, 메서드 호출이 끝나면 파괴된다. (메서드가 정상 리턴을 하든 예외 리턴을 하든 상관없다.)

프레임이 만들어진 스레드의 스택에 할당되며, 각 프레임은 다음과 같은 것들을 지닌다.

  • 지역변수 배열 (컴파일 시간에 결정)
  • 오퍼랜드 스택 (컴파일 시간에 결정)
  • 현재 메서드가 있는 클래스의 런타임 상수 풀의 레퍼런스
  • 이외에도 디버깅 정보

Summary

JVM은 이외에도 많은 알아야할 사항이 있다. 이번에는 메모리구조를 중심으로 살펴보고 싶어 공부해보았고, 기회가 된다면 다른 사항도 공부해야겠다.

(참고 링크) https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html

profile
해삐한 다영의 컴퓨터와 친해지기 프로젝트 🥰

0개의 댓글