JVM과 Java Code의 실행

보기·2022년 4월 24일
0

Java

목록 보기
3/3

JVM이란?

Java Vertual Machine

OS와 Java Bytecode사이에 있는 Bytecode 해석을 위한 가상 머신. 여러 회사(Oracle, OpenJDK, Zulu...)에서 각 사용 환경에 맞게 배포되어지고 있다.

Java는 가상머신 위에서 작동하는 방식을 채택해 OS에 독립적인 생태계를 구축할 수 있었고, 이후 나온 여러 프로그래밍 언어에 영향을 줬다.

JVM 구성요소

Class Loader

main method (프로그램 시작) 가 포함된 class file 을 시작으로, 동작에 필요한 라이브러리를 로직에 따라 탐색하고, 메모리에 적재한다.

메모리에 적재된 라이브러리(바이트코드)는 페이징 전략 없이 JVM 종료까지 계속 유지된다.

Garbage Collector

Heap 메모리 영역에 생성된 객체들 중 접근이 불가해진 객체를 메모리에서 제거하는 일을 수행함.

Java는 GC를 사용해 메모리 관리를 자동으로 수행해주긴 하나, 사용하지 않는 객체가 상호참조를 하거나 프로그램 흐름 상 종료까지 사용하지 않는 객체 등을 자동으로 찾아 제거해주지 못하므로 성능에 민감한 상황에서는 추가적인 최적화 작업이 요구된다.

Runtime Data Area

Excution engine

메모리에 적재된 클래스를 기계어로 번역하여 명령어를 직접적으로 실행한다.

과거 Java Excution Engine은 Byitecode를 Line마다 해석하는 인터프리터 방식으로 동작하여 실행 속도가 꽤 느렸으나, JIT 방식으로 변경된 이후 속도가 상당부분 개선되었다.

컴파일과 실행

컴파일 하는 방법

JDK(Java Developement Kit)에 포함된 javac 컴파일러로 자바 소스코드를 Bytecode로 컴파일 한다.

실행하는 방법

Terminal에서 Java JRE를 사용해 Java Cytecode를 실행한다.

바이트코드란 무엇인가?

JVM(Java Verture Machine)이 해석할 수 있는 언어로 변환된 소스 코드를 말한다.

Bytecode는 Java 뿐만 아니라, JVM 호환 언어(Kotlin, Scala, Groovy, ...) 모두 컴파일 결과물로 Bytecode를 생성한다.

JIT 컴파일러 동작 과정

인터프리터가 코드를 실행 시간에 해석하기 때문에, 필연적으로 속도가 느린 점을 보완하고자 해석한 소스코드를 캐싱하여 재사용하는 방식으로 속도를 향상시켰다.

JDK vs JRE

JRE (Java Runtime Environment)

Java Runtime Environment는 자바 애플리케이션을 생성하고 실행하는 데 목적을 둔 필요한 최소 구성 요소이며 JDK의 일부입니다.

JDK (Java Development Kit)

JDK는 Java 소프트웨어를 개발하는데 필요한 모든 것을 말합니다.
JDK에는 jre에는 없는 자바 소스 파일을 바이트코드로 변환해주는 javac, 소스 코드 주석으로부터 자동으로 문서를 생성해주는 툴인 javadoc, 자바 디버깅 툴인 jdb 등이 포함되어 있습니다.

profile
하루를 나답게

0개의 댓글