JVM(자바가상머신)이란? - Part 2, Execution Engine
JVM(자바가상머신)이란? - Part 1 자바를 쓰는 개발자라면 누구나 들어봤을 JVM(Java Virtual Machine)을 알아보려고 한다. 자바 바이트코드가 JRE에서 동작을 하는데, 이 JRE에서 가장 중요한 요소는 자바
ssdragon.tistory.com
JVM(자바가상머신)이란? - Part 3, ClassLoader
JVM(자바가상머신)이란? - Part 1 자바를 쓰는 개발자라면 누구나 들어봤을 JVM(Java Virtual Machine)을 알아보려고 한다. 자바 바이트코드가 JRE에서 동작을 하는데, 이 JRE에서 가장 중요한 요소는 자바
ssdragon.tistory.com
JVM(자바가상머신)이란? - Part4, Runtime Data Area
JVM(자바가상머신)이란? - Part 1, 소개 자바를 쓰는 개발자라면 누구나 들어봤을 JVM(Java Virtual Machine)을 알아보려고 한다. 자바 바이트코드가 JRE에서 동작을 하는데, 이 JRE에서 가장 중요한 요소는
ssdragon.tistory.com
자바를 쓰는 개발자라면 누구나 들어봤을 JVM(Java Virtual Machine)을 알아보려고 한다.
자바 바이트코드가 JRE에서 동작을 하는데, 이 JRE에서 가장 중요한 요소는 자바 바이트코드를 해석하고 실행하는 JVM(Java Virtual Machine)이다.
JRE는 자바 API와 JVM으로 구성되며, JVM의 역할은 Java Application을 클래스 로더(Class Loader)를 통해 읽어서 자바 API와 함께 실행하는 것이다.
JDK(Java Developer Kit)는 개발자가 사용하는 도구
JRE(Java Runtime Environment)는 자바를 개발하지 않고 실행만하는 환경
JDK = JRE + Java 개발도구
🤔 JVM(자바가상머신)이란?
JVM(Java Virtual Machine)이란 '자바를 실행하기 위한 가상 머신' 이다.
Java로 작성된 Application은 JVM에서만 실행이 된다.
그래서 Java Application은 OS와 하드웨어에는 독립적이다.
다른 OS에서도 실행이 가능하지만 JVM은 OS에 종속적이기 때문에 OS에 맞는 JVM이 필요하다.
실행하면 해석(interpret)되기 때문에 속도가 느리다는 단점을 가지고 있었지만,
바이트코드(컴파일된 자바코드)를 하드웨어의 기계어로 변환해주는 JIT컴파일러와 최적화 기술이 적용되어 개선되었다.
일반 Application은 바로 OS로 가기때문에 OS에 맞게 Application을 변경해야한다.
🤔 계속 말하기전에 JCP는 무엇인가?
JCP(Java Community Process)는 자바개발자 모임이기도 하며, 자바 기술에 대한 스펙을 제안하고 제공하는 곳이다.
여기서 스펙들에 대해 논의하고 여러 과정을 거쳐서 승인된다.
JEP(Java Enhancement Proposal)
Java 핵심 기술의 향상을 제안하는 문서이다. 이 제안들은 대부분 JSR이나 JLS같은 명세로 정리할 상태는 아니다.
OpenJDK 또는 JDK의 업데이트에 포함될 수 있는 제안 목록들이다.
JSR(Java Specification Request)
JCP의 새 명세를 만들기 위해 구성된 팀원들을 위해 만들어진 문서이다.
일반적인 JSR 주제는 이미 성숙된 기술과 관련이 있다. 다시 말하면 분류될 수 있는 상태에 있다.
JLS(Java Language Specification)
자바 언어의 명세서를 뜻한다.
자바 프로그래밍 언어를 위한 문법과 정상적/비정상적인 규칙들을 보여준다.
정상적인 프로그램을 실행하기 위한 프로그램 방법들도 보여준다.
요약하자면 JEP가 지속적으로 나오고 그 중 JSR로 승격될만한 것들을 선별하여 승격한다.
이러한 JSR을 구체화해서 버전별로 정의해둔 것이 JLS문서이다.
자 그럼 위 내용을 바탕으로 JVM Specification은 JCP에 의해서 만들어졌다.
Specification에 기반해서 만들어낸 구현체들을 배포하는 조직이나 사람들이 있는데, 이들을 일반적으로 Vendor라고 한다.
Vendor에서 유명한 VM은 오라클(Oracle)의 핫스팟, IBM의 VM이 있다. 이렇게 다양한 형태로 VM이 배포되고 있다.
JVM 구조
JVM Specification에 기반하여 비슷하게 그린 구조가 바로 다음과 같다.
"VM의 중요한 부분인 GC와 JIT 컴파일러는 어디있나요?" 라는 생각이 들 수 있다.
이것은 Specification에 나올 문장에서 설명된다.
현 JVM 규격에 명시되어 있지 않은 구현과 관련된 상세 사항들은 구현자의 창의성을 저해하는 불필요한 제약이 될 수 있습니다.
예를 들자면, 데이터 영역의 메모리 레이아웃이나 Garbage-Collection에 사용되는 알고리즘, 그리고 JVM 명령어 실행과 관련된 내부의 최적화(e.g., 기계어로 번역하는 과정) 에 관한 것들은 구현자의 재량으로 남겨두겠습니다.
즉, "사용되지 않는 메모리는 알아서 잘 회수하고, 바이트 코드의 실행속도도 알아서 최적화해라"라는 말인데,
필요 최소한의 역할만을 외부에 명시함으로써, 구현자의 개별적인 역량을 가능한 저해하지 않을 수 있다는 것이다.
그래서 이를 구현하는 Vendor들은 고도의 테크닉을 사용해서 뛰어난 JVM을 만들어낼 수 있었던 것이다.
그 결과로서의 좋은 예시가 지금 JVM에 구현되어있다는 GC 알고리즘이나 JIT 컴파일러이다.
💻 이번 글을 요약하자면?
JVM은 자바 프로그램을 OS에 상관없이 실행하기 위한 JRE의 중요한 요소인 자바가상머신이다.
JVM은 표준의 역할을 하는 문서가 존재하여 누구나 만들 수 있으며, 구현된 형태에 대해서는 제약이 없다.
그래서 Vendor들이 만들어 배포하는 것이다.
JVM Specification 문서는 상당히 많은 부분들이 추상적으로 작성되어 있다.
JVM은 추상화/다형성으로부터 얻을 수 있는 장점을 폭넓게 누릴 수 있도록 고안되어 있다.
현재의 JVM은 폭넓은 재량 하에 이루어진 구현자들의 고민과 노력의 산물이다. (GC 알고리즘, JIT 컴파일러 등)
참고
https://www.youtube.com/watch?v=6reapO0gLPs
'프로그래밍 > Java' 카테고리의 다른 글
자바 toCharArray() (2) | 2022.01.28 |
---|---|
JVM(자바가상머신)이란? - Part 2, Execution Engine (0) | 2022.01.26 |
valueOf() 와 parseInt() 의 차이점 (0) | 2022.01.21 |
컬렉션 프레임워크(Collections Framework) (0) | 2022.01.19 |
Java 언박싱 형변환 (0) | 2022.01.14 |