JVM은 무엇이며, 자바 프로그램은 어떻게 실행되는가❓

이상민·2021년 5월 18일
0
post-thumbnail

1. JVM

WORA를 가능하게 하는 자바 가상 기계

  • WORA(Write Once Run Anywhere) : 한번 코드를 작성에 모든 폴랫폼에서 바로 실행하는것

    • java 소스를 컴파일해 .class를 생성하고 이를 JVM으로 해석/실행 하므로 WORA를 달성한다
  • JVM 자체는 플랫폼에 종속적이다

  • JVM이 클래스 파일의 바이트 코드를 실행해 자바 앱이 실행된다


2. 컴파일하기

컴파일을 통해 .java 파일에서 .class를 생성한다

  • 컴파일 : 소스 파일을 컴퓨터가 이해할 수 있는 언어로 만드는 과정

    • C언어 : .c --> .obj (기계어)

    • 자바 : .java --> .class (바이트 코드)

  • .java 컴파일하기

    $ javac test.java


3. 실행하기

3-1. 컴파일 언어의 실행

  1. 여러 소스 파일로 나눠 개발
  2. 링크를 통해 모든 코드를 하나의 실행 파일에 저장
  3. 실행 파일을 모두 메모리에 올려 실행

3-2. JAVA의 실행

  1. 여러 소스 파일로 나눠 개발
  2. main() 메소드를 가진 클래스에서부터 실행 시작
  • JVM은 필요시 클래스 파일을 로딩해 적은 메모리로 실행 가능하다
$ javac test.java
$ java test

4. 바이트 코드란 무엇인가?

.java를 컴파일해 생성된 .class 파일이 바이트 코드이다

  • 바이트 코드 : JVM에서 실행 가능한 바이너리 코드

    • 기계어와 달리 CPU에 직접 실행 X

    • JVM이 인터프리터 방식으로 바이트 코드를 해석

  • 자바 소스 파일에 여러 클래스를 작성할 수 있고 컴파일시 클래스 마다 각각 클래스 파일이 생성된다


5. JIT(Just-In-Time) 컴파일러

바이트코드를 런타임에 기계어로 변환해주는 컴파일러

  • 자바 인터프리터로만 실행한다면 프로그램 실행을 느리게 한다

  • 이를 개선하기 위해 JIT 컴파일러를 사용한다

  • 자바 JIT 컴파일러가 하는 일

    • 바이트 코드를 파일, 메소드, 코드 일부 단위 등 여러 색션으로 읽어들인다

    • 실행될때 코드를 컴파일한다. 자주 실행되는 코드는 캐싱되 이후 컴파일 없이 쓸 수 있다

    • 스택에서 레지스터 연산으로 변환, 레지스터 할당으로 메모리 접근 줄이기 등 다양한 코드 최적화를 적용한다


6. JVM 구성 요소

  1. 자바 인터프리터 : 바이트 코드를 읽고 해석
  2. 클래스 로더 : 런타임에 모든 코드가 JVM과 연결. 동적으로 클래스를 로딩
  3. JIT 컴파일러
  4. 가비지 컬렉터 : 사용하지 않는 메모리를 자동으로 회수

7. JDK와 JRE의 차이

  • 자주 사용하는 자바 도구들
    • javac : 자바 소스를 바이트 코드로 변환하는 컴파일러
    • java : 자바 실행기
    • javadoc : 소스로부터 HTML 형식 API 문서 생성
    • jar : 자바 클래스들을 압축한 아카이브 파일 생성
    • jmod : 자바 모듈 파일을 만들거나 내용 출력
    • jlink : 응용프로그램에 맞춘 맞춤형 JRE
    • jdb : 실행 중 오류를 찾는 디버거
    • javap : 클래스 파일 디어셈블러
profile
편하게 읽기 좋은 단위의 포스트를 추구하는 개발자입니다

0개의 댓글