22.03.19 자바 - Java Virtual Machine(JVM)

김설영·2022년 3월 19일
0

부스트코스 (Edwith)

목록 보기
4/5
post-thumbnail

자바가상머신(JVM)이란 무엇인가?

위 글을 토대로 정리를 해두려고 한다. 너무 좋은글이다.

아래 내용은 위 명시한 블로그를 토대로 개인 공부를 한 글이라 난잡하다. 방문자는 없겠지만, 혹시나 방문하셨다면, 정확한 정보는 위 블로그에 방문하시기를 바랍니다.


JVM 역할

  • 자바 애플리케이션 실행
  • JAVA와 OS 사이의 중개자 (OS에 구애받지 않고 재사용 가능)
  • 메모리 관리 (Garbage collection 수행)
  • 스택(Stack)기반 가상 머신

JVM contents

class loader : JVM으로 클래스(.class)를 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈 (Loading, Linking, Initialization)

Execution Engine : 클래스를 실행시키는 역할. 클래스 로더가 바이트 코드를 Runtime data area에 배치시키면, 실행엔진에 의해 실행된다. 바이트 코드를 머신 코드로 변경을 해줘야 하는데, 두 가지 방식이 있음.

  • interpreter : java byte code를 명령어 단위로 읽어서 실행 -> 한줄씩 수행해서 느림

  • JIT(Just-In-Time) compiler : 인터프리터 방식으로 실행하다가, 적절한 시점에 byte code 전체를 compile하여 native code로 변경한다. 이후, 인터프리팅 대신 native code로 직접 실행한다. native code는 cache에 보관하기 때문에, 한 번 compile된 code는 빠르게 수행한다. compile 과정이 interpreting보다 오래걸리기 때문에 단회 실행 code는 interpreting을 하는 것이 유리하다. (JIT compiler를 사용하는 JVM들은 내부적으로 얼마나 자주 수행되는지 확인하며, 일정한 정도를 넘을 때만 JIT 컴파일을 한다.)

  • Garbege collector : Garbage collection을 수행하는 모듈(쓰레드)

Runtime Data Area : 프로그램을 수행하기 위해 OS에서 할당받은 memory 공간

  • pc register : Thread가 시작될 때 생성. Thread마다 하나씩 존재하며, 현재 수행 중인 JVM 명령의 주소를 가짐.

  • JVM stack : 프로그램 실행 과정에서 임시 할당 > 메소드를 빠져나가면 바로 소멸되는 특성의 데이터를 저장하기 위한 영역. 각종 형태의 변수, 임시 데이터, Thread, method 정보 저장. method 호출 시마다 각각의 stack frame(해당 method만을 위한 공간) 생성 > method 수행이 끝나면 frame 별로 삭제. method 안의 local 변수 저장. 및 호출된 method의 매개변수, 지역변수, 리턴 값, 연산 시 발생하는 값들을 임시로 저장.

  • Native method stack : byte code가 아닌 머신 코드로 작성된 프로그램을 실행시키는 영역. JAVA native interface를 통해 byte code로 전환하여 저장. kernel이 stack을 잡아 독자적으로 프로그램을 실행시키며, C code를 실행시켜 Kernel에 접근할 수 있음.

  • Method area : Class area, Static area 라고도 한다. 클래스 정보를 처음으로 메모리 공간에 올릴 때, 초기화 되는 대상을 저장하기 위한 메모리 공간이다. Runtime constant pool이라는 별도의 관리 영역이 있고, 여기에는 상수 자료형이 저장되며, 이를 참조한다. 또한, 중복을 막는 역할을 수행한다. 올라가는 정보 종류 > Field information(멤버변수 이름, 데이터 타입, 접근 제어자 정보) / Method information(메소드 이름, 리턴 타입, 매개 변수, 접근 제어자 정보) / Type information(class, interface여부 저장, /type 속성, 전체 이름, super class의 전체 이름)

  • Heap : 객체를 저장하는 가상 메모리 공간. new 연산자로 생성된 객체와 배열을 저장함.
    permeanent generation : 생성된 객체들의 정보 주소값이 저장된 공간. JVM에 의해 사용됨. class loader에 의해 load 되는 class, method 등에 대한 meta information이 저장되며, reflection을 사용하여 동적으로 클래스가 로딩되는 경우에 사용. (spring framework 사용 시 고려 대상)
    New/Young 영역 : Eden > 객체가 최초로 생성되는 공간 , Survivor 0/1 > Eden 에서 참조되는 객체들이 저장되는 공간
    Old 영역 : New area에서 일정 시간 참조되고 있는, 살아남은 객체들이 저장되는 공간. Eden 영역에 객체가 가득 차면, 첫번째 GC가 발생함. -> Eden 영역에 있는 값들을 Survivor1에 복사하고, 이 영역을 제외한 나머지 영역을 삭제

Instance는 소멸 방법 및 시점이 지역 변수와는 다르기 때문에, heap이라는 별도의 영역에 할당 됨. JVM은 매우 합리적으로 인스턴스를 소멸시킴.

Java 실행 과정

프로그램 실행 -> JVM이 OS로부터 프로그램이 필요로 하는 메모리를 할당 받음 -> 할당 받은 메모리를 용도에 따라 여러 영역으로 나누어 관리 -> 자바 컴파일러(javac)가 소스코드(.java)를 읽어들인 후, 자바 바이트코드(.class)로 변환 -> Class loader가 class 파일들을 JVM으로 로딩 -> Execution engine이 로딩된 class 파일들을 해석 -> 해석된 바이트 코드는 Runtime Data Area에 배치되어 실질적인 수행이 이뤄짐 -> JVM은 필요에 따라 Thread synchronizaion, GC 같은 관리작업 수행

profile
블로그 이동하였습니당! -> https://kimsy8979.tistory.com/

0개의 댓글