JVM이란 무엇입니까? Java Virtual Machine 소개

Java Virtual Machine은 다른 프로그램을 실행하는 것을 목적으로하는 프로그램입니다. 쿵푸 코딩의 가장 위대한 예 중 하나이기도 한 간단한 아이디어입니다 . JVM은 당분간 현상 유지를 뒤엎고 오늘날에도 프로그래밍 혁신을 계속 지원하고 있습니다.

JVM의 용도

JVM에는 두 가지 기본 기능이 있습니다. 즉, Java 프로그램이 모든 장치 또는 운영 체제에서 실행될 수 있도록하는 것 ( "한 번 작성하면 어디서나 실행"원칙이라고 함)과 프로그램 메모리를 관리 및 최적화하는 것입니다. 1995 년 Java가 출시되었을 때 모든 컴퓨터 프로그램은 특정 운영 체제에 작성되었으며 프로그램 메모리는 소프트웨어 개발자가 관리했습니다. 그래서 JVM은 계시였습니다.

자바 월드 /

JVM에 대한 기술적 정의를 갖는 것은 유용하며 소프트웨어 개발자가 그것에 대해 생각하는 일상적인 방법도 있습니다. 그것들을 분해 해보자 :

  • 기술적 정의 : JVM은 코드를 실행하고 해당 코드에 대한 런타임 환경을 제공하는 소프트웨어 프로그램의 사양입니다.
  • 일상적인 정의 : JVM은 Java 프로그램을 실행하는 방법입니다. JVM의 설정을 구성한 다음이를 사용하여 실행 중에 프로그램 리소스를 관리합니다.

개발자가 JVM에 대해 이야기 할 때 일반적으로 Java 앱의 리소스 사용량을 나타내고 제어하는 ​​시스템, 특히 서버에서 실행되는 프로세스를 의미합니다. 이 작업을 수행하는 프로그램을 빌드하기위한 요구 사항을 설명 하는 JVM 사양 과 대조 됩니다.

누가 JVM을 개발하고 유지합니까?

JVM은 기업 및 오픈 소스 모두에서 매우 뛰어난 프로그래머가 널리 배포하고 많이 사용하며 유지 관리합니다. OpenJDK 프로젝트는 Sun Microsystems가 오픈 소스 Java를 결정한 결과입니다. OpenJDK는 Oracle의 Java 관리를 통해 계속되어 왔으며 요즘에는 Oracle 엔지니어가 많은 작업을 수행했습니다.

JVM의 메모리 관리

실행중인 JVM과의 가장 일반적인 상호 작용은 힙 및 스택의 메모리 사용량을 확인하는 것입니다. 가장 일반적인 조정은 JVM의 메모리 설정을 조정하는 것입니다.

가비지 수집

Java 이전에는 모든 프로그램 메모리가 프로그래머에 의해 관리되었습니다. Java에서 프로그램 메모리는 JVM에 의해 관리됩니다. JVM은 Java 프로그램에서 사용되지 않는 메모리를 지속적으로 식별하고 제거하는 가비지 콜렉션 이라는 프로세스를 통해 메모리를 관리 합니다. 가비지 콜렉션은 실행중인 JVM 내에서 발생합니다.

초기에 Java는 C ++만큼 "금속에 가깝지"않아서 빠르지 않다는 이유로 많은 비판을 받았습니다. 가비지 컬렉션 프로세스는 특히 논란이 많았습니다. 그 이후로 다양한 알고리즘과 접근법이 제안되어 가비지 콜렉션에 사용되었습니다. 일관된 개발 및 최적화를 통해 가비지 컬렉션이 크게 향상되었습니다.

'금속에 가깝다'는 것은 무엇을 의미합니까?

프로그래머가 프로그래밍 언어 또는 플랫폼이 "금속에 가깝다"고 말하면 개발자가 운영 체제의 메모리를 프로그래밍 방식으로 (코드를 작성하여) 관리 할 수 ​​있음을 의미합니다. 이론적으로 프로그래머는 사용량과 폐기시기를 지정하여 프로그램에서 더 많은 성능을 끌어낼 수 있습니다. 대부분의 경우 JVM과 같이 고도로 정제 된 프로세스에 메모리 관리를 위임하면 직접 수행하는 것보다 성능이 향상되고 오류가 줄어 듭니다.

세 부분의 JVM

JVM에는 사양, 구현 및 인스턴스의 세 가지 측면이 있다고 말할 수 있습니다. 이들 각각을 고려해 봅시다.

1. JVM 사양

첫째, JVM은 소프트웨어 사양입니다. 다소 순환적인 방식으로 JVM 사양은 구현 세부 사항이 사양 내에 정의 되어 있지 않다는 점을 강조하여 구현 에서 최대한의 창의성을 허용합니다.

"Java 가상 머신을 올바르게 구현하려면 class파일 형식 을 읽고 여기에 지정된 작업을 올바르게 수행하기 만하면됩니다."

JS Bach는 한때 음악 제작에 대해 다음과 같이 설명했습니다.

"적절한 시간에 올바른 키를 터치하기 만하면됩니다."

따라서 JVM이해야 할 일은 Java 프로그램을 올바르게 실행하는 것입니다. 단순 해 보이지만 외부에서 보면 단순 해 보일 수도 있지만, 특히 Java 언어의 성능과 유연성을 고려할 때 엄청난 작업입니다.

가상 머신으로서의 JVM

JVM은 이식 가능한 방식으로 Java 클래스 파일을 실행 하는 가상 머신 입니다. 가상 머신이라는 것은 JVM이 프로그램이 실행되는 서버와 같은 기본 실제 머신의 추상화라는 것을 의미합니다. 실제로 존재하는 운영 체제 또는 하드웨어에 관계없이 JVM은 프로그램을 실행할 수있는 예측 가능한 환경을 만듭니다. 그러나 실제 가상 머신과 달리 JVM은 가상 운영 체제를 생성하지 않습니다. JVM을 관리되는 런타임 환경 또는 프로세스 가상 머신 으로 설명하는 것이 더 정확 합니다 .

2. JVM 구현

JVM 사양을 구현하면 JVM 구현 인 실제 소프트웨어 프로그램이 생성됩니다. 사실, 오픈 소스와 독점의 많은 JVM 구현이 있습니다. OpenJDK의 HotSpot JVM은 참조 구현이며 세계에서 가장 철저하게 검증 된 코드베이스 중 하나입니다. HotSpot은 또한 가장 일반적으로 사용되는 JVM입니다.

거의 모든 라이선스 JVM은 Oracle의 라이선스 JDK를 포함하여 OpenJDK 및 HotSpot JVM에서 포크로 생성됩니다. OpenJDK에서 라이센스가 부여 된 포크를 만드는 개발자는 종종 OS 별 성능 향상을 추가하려는 욕구에 동기를 부여받습니다. 일반적으로 JVM을 JRE (Java Runtime Environment)의 번들 부분으로 다운로드하여 설치합니다.

3. JVM 인스턴스

JVM 사양이 구현되어 소프트웨어 제품으로 출시 된 후에는 프로그램으로 다운로드하여 실행할 수 있습니다. 다운로드 한 프로그램은 JVM의 인스턴스 (또는 인스턴스화 된 버전)입니다.

대부분의 경우 개발자가 "JVM"에 대해 이야기 할 때 소프트웨어 개발 또는 프로덕션 환경에서 실행되는 JVM 인스턴스를 의미합니다. "Hey Anand, 해당 서버의 JVM이 얼마나 많은 메모리를 사용하고 있습니까?"라고 말할 수 있습니다. 또는 "내가 순환 호출을 생성했고 스택 오버플로 오류로 인해 JVM이 중단되었다는 사실을 믿을 수 없습니다. 초보 실수입니다!"

소프트웨어 사양이란 무엇입니까?

소프트웨어 사양 (또는 투기) 소프트웨어 시스템이 작동하는 방법을 설명하는 사람이 읽을 수있는 디자인 문서입니다. 사양의 목적은 엔지니어가 코딩 할 명확한 설명과 요구 사항을 만드는 것입니다.

JVM에서 클래스 파일로드 및 실행

Java 응용 프로그램을 실행하는 데있어 JVM의 역할에 대해 이야기했지만 어떻게 그 기능을 수행합니까? Java 애플리케이션을 실행하기 위해 JVM은 Java 클래스 로더와 Java 실행 엔진에 의존합니다.

JVM의 Java 클래스 로더

Java의 모든 것은 클래스이며 모든 Java 애플리케이션은 클래스에서 빌드됩니다. 애플리케이션은 하나 또는 수천 개의 클래스로 구성 될 수 있습니다. Java 애플리케이션을 실행하기 위해 JVM은 컴파일 된 .class 파일을 액세스 할 수있는 서버와 같은 컨텍스트로로드해야합니다. JVM은이 기능을 수행하기 위해 클래스 로더에 의존합니다.

Java 클래스 로더는 클래스를 메모리에로드하고 실행할 수 있도록하는 JVM의 일부입니다. 클래스 로더는 지연로드 및 캐싱과 같은 기술을 사용하여 가능한 한 효율적으로 클래스를로드합니다. 즉, 클래스 로딩은 휴대용 런타임 메모리 관리와 같은 대단한 두뇌 맛보기가 아니기 때문에 기술은 비교적 간단합니다.

모든 Java Virtual Machine에는 클래스 로더가 포함됩니다. JVM 사양은 런타임에 클래스 로더를 쿼리하고 조작하는 표준 방법을 설명하지만 JVM 구현은 이러한 기능을 수행해야합니다. 개발자의 관점에서 기본 클래스 로더 메커니즘은 일반적으로 블랙 박스입니다.

JVM의 실행 엔진

클래스 로더가 클래스로드 작업을 완료하면 JVM은 각 클래스에서 코드 실행을 시작합니다. 실행 엔진은 이 기능을 처리하는 JVM 성분이다. 실행 엔진은 실행중인 JVM에 필수적입니다. 실제로 모든 실용적인 목적을 위해 JVM 인스턴스입니다.

코드 실행에는 시스템 리소스에 대한 액세스 관리가 포함됩니다. JVM 실행 엔진은 파일, 네트워크 및 메모리 리소스에 대한 수요가있는 실행중인 프로그램과 해당 리소스를 제공하는 운영 체제 사이에 있습니다.

실행 엔진이 시스템 리소스를 관리하는 방법

시스템 리소스는 메모리와 그 밖의 모든 범주로 나눌 수 있습니다.

JVM이 사용하지 않는 메모리를 처리하고 가비지 콜렉션이 해당 처리를 수행하는 메커니즘임을 상기하십시오. JVM은 또한 개발자가 당연한 것으로 간주 하는 참조 구조 를 할당하고 유지 관리합니다 . 예를 들어 JVM의 실행 엔진은 newJava 의 키워드 와 같은 것을 가져 와서 메모리 할당을위한 OS 별 요청으로 변환하는 역할을합니다.

메모리 외에도 실행 엔진은 파일 시스템 액세스 및 네트워크 I / O를위한 리소스를 관리합니다. JVM은 운영 체제간에 상호 운용이 가능하기 때문에 이것은 단순한 작업이 아닙니다. 각 애플리케이션의 리소스 요구 사항 외에도 실행 엔진은 각 OS 환경에 응답해야합니다. 이것이 JVM이 야생의 요구를 처리 할 수있는 방법입니다.

JVM 진화 : 과거, 현재, 미래

1995 년에 JVM은 현대 소프트웨어 개발의 표준이 된 두 가지 혁신적인 개념 인 "한 번 작성하면 어디서나 실행"과 자동 메모리 관리를 도입했습니다. 당시 소프트웨어 상호 운용성은 대담한 개념 이었지만 오늘날에는 이에 대해 두 번 생각하는 개발자가 거의 없습니다. 마찬가지로, 엔지니어링 선조가 프로그램 메모리를 직접 관리해야했지만, 우리 세대는 가비지 수집으로 성장했습니다.

James Gosling과 Brendan Eich는 현대적인 프로그래밍을 발명했지만 수천 명의 다른 사람들이 그 후 수십 년 동안 아이디어를 개선하고 구축했다고 말할 수 있습니다. Java Virtual Machine은 원래 Java 전용 이었지만 오늘날에는 Scala, Groovy 및 Kotlin을 포함한 많은 스크립팅 및 프로그래밍 언어를 지원하도록 발전했습니다. 앞으로 JVM이 개발 환경에서 두드러진 부분이 아닌 미래를보기는 어렵습니다.

JVM에 관한 모든 것

  • 자바 챌린저 : JVM의 스레드 동작
  • 자바 챌린저 : JVM의 메소드 오버로딩
  • 내부 JVM 성능 최적화
  • 바이트 코드 기초 : JVM이 바이트 코드를 처리하는 방법
  • Java 예외 : JVM이 예외를 처리하는 방법
  • 간결하고 평균적인 Java 가상 머신 소개

"JVM이란 무엇인가? Java Virtual Machine을 소개한다"는이 이야기는 원래 JavaWorld에서 출판했습니다.