TIL

[JAVA] JVM이 정확히 무엇이고, 어떤 기능을 하는지 설명해 주세요.

승무_ 2023. 6. 22. 11:52

JVM

JVM은 자바 가상 머신으로 컴파일 된 바이트 코드를 os, 하드웨어에 상관 없이 자바 프로그램이 동일하게 실행 되도록 돕는다.

 

컴파일, 실행 과정

C/C++ 프로그램의 경우, 여러 소스파일로 나누어 개발하고 링크를 통해 실행에 필요한 모든 코드를 하나의 실행파일(.exe)에 저장하고 이 실행 파일은 모두 메모리에 올려져야 실행된다. 메인 메모리의 크기가 작은 경우 불리함이 따른다. 컴파일은 코드를 읽고 해석하여 전체 소스코드를 기계어로 바꾸어 파일로 생성하기 때문에 빌드 과정은 오래걸리지만 막상 실행하면 기계어를 읽기만 하면 되기 때문에 빠르게 실행된다.

반면 Java에서 컴파일은 기존의 컴파일 과정과 조금 다르게 진행된다. Java의 컴파일러인 javac.exe는 JVM이 이해할 수 있게 중간 단계인 바이트 코드(.class)로 변환시켜 주고 프로그램을 실행하게 되면 JVM이 이 바이트 코드를 기계어로 변환시켜 실행하게 된다. 바이트 코드를 하나의 실행 파일로 만드는 링크 과정이 없다. 실행의 경우 main()메소드를 가진 클래스에서부터 시작되고, JVM은 필요할 때 클래스 파일을 로딩하여 실행 하기 때문에 적은 메모리로 실행이 가능하다는 특징이 있다.

 

JIT 컴파일러란 무엇이며 어떻게 동작하는가?

Just-In-Time compilation(JIT)란 프로그램을 실제 실행하는 시점에서 기계어로 번역하는 컴파일 기법이다. 인터프리터 방식과 컴파일 방식을 혼합한 방식으로 볼 수있고, 실행시점에 인터프리터 방식으로 기계어 코드를 생성하면서 그 코드를 캐싱하여 같은 함수가 여러 번 호출될 때 매번 생성하는 것을 방지한다.

 

JVM 구성요소

클래스 로더(Class Loader):
클래스 로더는 JVM이 실행할 클래스 파일들을 로드하는 역할을 합니다. 예를 들어, 자바 프로그램이 실행될 때 클래스 로더는 필요한 클래스 파일들을 찾고 메모리에 로드합니다.

가비지 컬렉터(Garbage Collector):
가비지 컬렉터는 자바 프로그램에서 사용되지 않는 객체들을 자동으로 탐지하고 메모리를 회수하는 역할을 합니다. 예를 들어, 객체가 더 이상 참조되지 않을 때 해당 객체를 메모리에서 해제합니다. 가비지 컬렉터는 자바 프로그래머가 명시적으로 메모리 관리를 하지 않아도 자동으로 메모리를 관리해줍니다.

 

JDK와 JRE의 차이

JDK는 자바 애플리케이션을 개발하는 데 필요한 모든 도구와 라이브러리를 제공하며, JRE는 자바 애플리케이션을 실행하는 데 필요한 최소한의 구성 요소를 제공합니다.

 

꼬리 질문

  • 그럼, 자바 말고 다른 언어는 JVM 위에 올릴 수 없나요?
더보기

 Kotlin은 내부적으로 자바 라이브러리를 사용하고 자바와 호환되는 바이트 코드를 생성하여 JVM 상에서 실행하기 때문에 JVM 위에 올릴 수 있습니다.

  • 반대로 JVM 계열 언어를 일반적으로 컴파일해서 사용할 순 없나요?
더보기

JVM 계열 언어는 일반적인 언어랑 컴파일 과정이 다르기 때문에 직접적으로 기계어로 변환할 수 없을 거 같습니다.

  • JVM을 사용함으로써 얻을 수 있는 장점과 단점에 대해 설명해 주세요.
더보기

JVM의 가장 큰 장점은 os, 하드웨어에 상관없이 동일한 자바 응용프로그램을 실행할 수 있다는 것입니다. 그리고 garbage collector를 통해 자동적으로 메모리 관리를 할 수 있다는 장점도 있습니다.

 

단점은 일반적인 언어와 다르게 바이트 코드를 거친 후 기계어로 변환 되기 때문에 추가적인 오버헤드가 발생한다는 것입니다.

  • JVM과 내부에서 실행되고 있는 프로그램은 부모 프로세스 - 자식 프로세스 관계를 갖고 있다고 봐도 무방한가요?
더보기

JVM은 단일 프로세스 내에서 실행되는 가상 머신입니다. 따라서 JVM 내부에서 실행되는 프로그램은 JVM의 스레드(thread)로 실행되기 때문에 부모 프로세스 - 자식 프로세스 관계는 아닙니다.

'TIL' 카테고리의 다른 글

Queue vs Stack  (0) 2023.06.27
Array vs LinkedList  (0) 2023.06.26
[JAVA] Enum을 사용하는 이유  (0) 2023.03.28
도커를 사용하는 이유  (0) 2023.03.08
[Sql] 문제 풀이  (0) 2023.03.04