JVM 구조와 컴파일 과정

조현수·2023년 11월 23일
0

JVM

JVM이란 자바 버츄어 머신을 줄인말로 자바를 실행하기 위한 가상머신이다.

일반 애플리케이션은 OS만 거치고 하드웨어로 바로 전달되는데에 비해

자바애플리케이션은 JVM을 한번 더 거치기 때문에 그리고 하드웨어에 맞게 완전히 컴파일된 상태가 아니고 실행시에 해석되기 때문에 속도가 느리다는 단점을 가지고 있다.

자바 실행 순서

소스코드단계

  1. 개발자는 .java 확장자를 가진 파일에 자바 소스코드를 작성한다

컴파일단계

  1. 어플리케이션이 실행되면 JVM이 OS로부터 메모리를 할당받는다.
  2. 자바 컴파일러(javac.exe)가 자바소스코드(.java)를 읽어 바이트코드(.class)로 변환
    • 바이트코드란 jvm이 알아들을 수 있는 명령어 집합이다.
    • 문법검사 더이상안함으로서 시간단축, 하지만 매번 컴파일하고 실행시켜야해서 시간이소요되는단점이 있다

클래스 로딩 단계

  1. Class Loader .를 통해 바이트코드를 JVM으로 로딩
    • 클래스 로더런타임데이터 에어리어라는 JVM이사용하는 가상 공간인데, 이곳으로 보낸다
  2. 로딩된 바이트코드는 Excution Engine을 통해 해석됨.
    • Excution Engine - Runtime Data Area에 할당된 바이트 코드를 실행시키는 주체.
                                  코드를 실행하는 방식은 두가지다.
      | 1. Interpreter 인터프리터
      -바이트 코드를 해석하여 실행하는 역할을 수행
      -다만 같은 메소드라도 여러번 호출될 때 매번 새로 수행해야 한다.
      1. JIT Compiler 프로그램의 실행속도를 향상시키기 위해 사용된다. 자주 사용되는 바이트코드부분을 캐싱하여 기계어로 변환하는방식 . 다시 실행할때 빠르게 실행된다
  3. 해석된 바이트코드는 Runtime Data Areas에 배치되어 실행됨.
    • 이곳이 실질적인 데이터를 할당받아 실행하는 영역으로 보면 된다.
    • 실행되는 과정에서 garbage collector(GC)같은 작업이 수행된다
  4. RUN TIME DATA AREA는 다섯가지영역으로 나누어져있다.

RUNTIME DATA AREA

Method Area

  1. 클래스에 대한 모든 정보가 저장되는 곳 (클래스의 구조, 필드, 메서드, 생성자,인터페이스)

    클래스의 메서드와 생성자, 인터페이스 메서드에 대한 바이트코드가 여기에 저장된다.

  2. 정적변수가(static)이 영역에 저장된다.

  3. 문자열 상수와 타입 필드 메서드의 이름이 이곳에 저장된다.

  4. 모든 스레드가 공유된다. (자바는 기본적으로 하나의 스레드 (main)가 있지만 멀티스레딩도 가능)

Heap

  1. 동적으로 할당된 메모리 영역 , new로 생성된 객체와 배열들이 이곳에 할당된다.
  2. 모든 Object 타입의 데이터가 할당이 된다.
  3. 가비지컬렉션이 존재한다.
  4. 메모리 크기는 jvm이 시작될때 정해지고 조정이 가능하다.
  5. 모든 스레드가 공유된다.

Stack Area

  1. 지역변수나 메서드의 매개변수, 임시적으로 사용되는 변수, 메서드의 정보가 저장되는곳.

    지역변수와 매개변수 특성상 호출이 종료되면 이 영역은 사라진다.

Pc register

  1. 컴퓨터를 이야기하는것이 아님.
  2. 쓰레드가 시작될때 생성되며 현재 수행중인 jvm의 명령어 주소를 저장하는 공간이다.

native method stack

  1. 자바가 아닌 다른 언어로 작성된 코드를 위한 공간이다.

Person p = new Person();은 어디에 저장될까 ?

p는 stack에 생성된다. 하지만 new Person은 heap 영역에 생성된다.

이 문제는 참조 by reference 와 참조 by value문제에서 다시 다루겠다.

profile
얼레벌레 꾸준히 하는 사람

0개의 댓글