자바코드의 실행과 메모리구조 그리고 JVM - 2

Muzi·2023년 3월 21일
0

JAVA

목록 보기
3/4

Intro

java 명령어는 자바 애플리케이션을 시작한다.
java 명령어는 먼저 JRE(Java Runtime Environment)를 시작하고,
인자로 지정된 클래스(public static void main(String[] args)를 포함하고 있는 클래스)를 로딩하고,
main() 메서드를 호출한다.

$ java test.class 또는 $ java test를 통해 .class파일을 실행시키면


JDK, JRE, JVM

JDK를 사용해서 바이트코드(class 파일)를 만들고,

JRE를 사용해서 바이트코드를 실행하면,

JVM이 기동되면서 바이트코드의 실질적인 실행(실제 OS에 메모리 할당/회수, 시스템 명령 호출 등 요청)을 담당한다.

아래는 JDK, JRE, JVM 관계

JDKJREJVM
JDK는 개발자 키트
개발에 필요한 어플리케이션 소프트웨어
소프트웨어 번들, 클래스와 라이브러리 및
필수적인 라이브러리 컴포넌트들을 제공
실행에 필요한
환경 제공
플랫폼에 독립적플랫폼에 독립적플랫폼에 종속적

JDK

  • Java 프로램을 작성하고, JRE를 실행하는데 필요한 툴들을 가지고 있음
  • 컴파일러(JAVAC)와 디버거, 자바 어플리케이션 런처 등을 포함
  • JVM이 읽을 수 있는 언어로 변경해줌

JRE

  • 컴파일된 코드를 읽는건 JRE의 java명령어
  • JRE가 시작된다는 것은 결국 java 명령어의 인자로 지정된 클래스를 실행하기 위한 자바 환경이 조성됨을 의미
  • 프로그램 내에 main()메서드가 존재하는지 확인한다
  • java명령어 인자로 지정한 설정 옵션에 맞게 JVM이 실행됨

JVM

예를들어 NVIDIA 라는 그래픽카드 회사가 있다. 이 회사는 그래픽카드를 만드는 것 뿐만 아니라, 특정 스펙을 만들어서 주변 공급업체인 MSI, GIGABYTE 같은 회사에게 전달해주면, 이 회사 들은 전달받은 스펙에 따라 그래픽카드를 만들어서 판매되게 된다

Oracle 이라는 회사가, JVM의 스펙과 표준을 정의하면, 공급업체들이, JVM을 실제 그래픽카드처럼 실물을 만들어서 배포하게 된다. 이 공급업체를 Vendor라고 한다

JIT

자바는 느릴까?

자바의 특징인 인터프리터를 하는 과정과, 인터프리터 과정 전에, 컴파일 과정을 한번 걸쳐서 그러는데, 여전히 자바의 이런 특징 때문에, 여러 언어들로부터 공격(?)을 받는 이유

1. 컴파일 방식 : 소스코드를 한꺼번에 컴퓨터가 읽을 수 있는 native machine(기계어)로 변환
2. 인터프리터 방식 : 소스코드를 빌드시에 암것도 하지 않다가, 런타임시에 한줄 한줄 읽어가며 변환
-> Java는 두 방식 모두 사용 => JIT 컴파일러의 도입

  • 반복되는 코드를 모두 컴파일러로 컴파일 시킴
  • 인터프리터의 역할 보조
  • 번역 안할래 = 인터프리터가 안 읽는다는 뜻

Reference

아래 블로그들을 토대로 작성하였습니다

https://catch-me-java.tistory.com/11

profile
좋아하는걸 열심히

0개의 댓글