[Java] JVM이란.
JVM(Java Vitual Machine)
최근 백기선님의 자바 스터디를 알게되어서, 한번 자바에 대한 개념을 스터디를 통해서 잡고 가면 좋을 듯해서 글에 대해서 정리해보겠습니다.
Java의 특징.
기본적으로 자바 프로그램은 JVM위에서 동작합니다. 이러한 JVM위에 동작하기 위해서는 자바 바이트 코드가 필요합니다. 이러한 자바 바이트코드는 개발자에 의해서 작성된 자바 소스코드(*.java
)가 자바 컴파일러(javac
)로 인해 변환된 코드(*.class
)를 의미합니다.
Java 프로그램의 특징
- JVM은 Bytecode를 구동하고 있는 OS에 맞춰 Binary code로 해석됩니다. 그렇기 때문에 OS에 독립적입니다.
- Bytecode는 클래스 단위(
*.class
)로 생성되기 때문에 프로그램의 수정이 일어나도 전체 소스코드를 컴파일할 필요는 없습니다. - JVM은 OS로부터 메모리를 할당받아 스스로 관리합니다. 대표적으로 Garbage Collection이 있습니다.
JVM이란?
JVM이란 Java Virtual Machine의 약자입니다. 이를 번역하면 자바 가상머신입니다. (프로그램을 실행하기 위해 물리적 머신과 유사한 머신을 소프트에어로 구현하였습니다.)
JVM의 역할은 자바 Application을 클래스 로더를 통해 읽어서 자바 Application을 클래서 로더를 통해 읽어서 자바 API와 함께 실행하는 것입니다. 그리고 JVM은 Java와 OS사이에서 중개자 역할을 수행하며 Java가 OS에 구애받지 않고 재사용 가능하게 해줍니다.
JVM의 기능
- JAVA가 OS에 상관없이 동작할 수 있도록 중계자 역할을 합니다.
- GC(Garabage Collection)등의 기능을 제공합니다.
JVM의 용도
- 자바 프로그램이 어느 기기, 또는 어느 운영체제 상에서도 실행될 수 있게 합니다.
- 프로그램 메모리를 관리하고 최적화합니다.
바이트 코드란?
- JVM이 이해할 수 있는 형태의 언어.
JVM의 구성과 구동과정.
기존의 자바는 C++ 처럼 빠르지 못하다는 비평을 받았으나, 다양한 알고리즘과 접근방식이 제안되어 개선되고 있습니다.
JVM의 구동은 다음과 같이 진행됩니다. 이를 하나씩 설명해보면 다음과 같습니다.
Class Loader(클래스 로더)
- JVM내로 클래스(.class파일)을 로드하고 링크를 통해 배치하는 작업을 수행하는 모듈입니다.
- Runtime 시 동적으로 클래스를 로드합니다.
- jar 파일 내에 저장된 클래스를 JVM 위에 탑재하고 사용하지 않는 클래스들은 메모리에서 삭제합니다.
Execution Engine(실행 엔진)
- 클래스 로더에서 분석된 클래스 파일의 데이터를 저장하고 실행 도중에 필요한 데이터를 저장하고 실행 도중에 필요한 데이터를 실행합니다.
Runtime Data Area
- JVM의 메모리 영역입니다.
-
크게 4가지로 구분할 수 있습니다.
-
클래스 영역
- 실행에 필요한 클래스를 로드해서 저장합니다.
- 내부에서 메소드 영역과 상수 영역으로 나눠집니다.
-
가비지 컬렉션 힙 영역
- GC에 의해 관리되는 영역입니다.
- 동적 메모리 할당 영역이며, 일반적으로
new
를 사용해 객체를 선언할 때 할당되는 영역입니다.
-
런타임 스택 영역
- 프로그램 실행 중 발생하는 메소드 호출과 복귀에 대한 정보를 저장합니다.
-
네이티브 메소드 스택 영역
- 자바는 하드웨어를 직접 제어하는 기능이 없어서 C언어와 같은 다른 언어의 기능을 빌려 사용합니다.
- 이때 사용하는 기술이 JNI 기술이며 네이티브 메소드들을 바이트 코드로 변환되고 사용되고 기록됩니다.
-
Garbage Collector
- 비지 컬렉션이란 프로세스를 통해 메모리를 관리하며, 이 가비지 컬렉션은 자바 프로그램에서 사용되지 않는 메모리를 지속적으로 찾아내서 제거합니다.
- 과거의 가비지 컬렉션에 비해 알고리즘과 접근방식의 변경, 최적화 등으로 인해 개선되었습니다.
컴파일러와 인터프리터
자바에 대해서 좀 더 잘 알기 위해서는 인터프리터에 대해 개념을 아는 것이 중요합니다.
컴파일러, 인터프리터 둘 다 사람이 보는 고레벨 언어로 작성된 프로그래밍 언어(C++, Java 등등)를 기계어로 변환하는 것은 같으나 그 과정에 있어서 차이가 존재합니다. 컴파일러는 전체소스코드를 보고 명령어를 수집하고 재구성하는 반면 인터프리터는 소스코드의 각 행을 연속적으로 분석하며 실행하는 구조를 가지고 있습니다.
인터프리터의 특성
인터프리터의 특성을 좀 더 자세하게 정리하면 다음과 같습니다.
- 고레벨 언어를 중간 코드로 변환하고 이를 각 행마다 실행합니다.
- 일반적으로 컴파일러가 각 행마다 실행하는 특성을 가진 인터프리터보다는 실행시간이 빠릅니다다.
- 컴파일러는 전체 소스코드를 변환 한 뒤 에러를 보고하지만 인터프리터는 각 행마다 실행하는 도중 에러가 보고되면 이후의 코드는 확인하지 않습니다.
-
인터프리터 언어로는 다음과 같이 있습니다.
ex) 파이썬
- 컴파일 언어
ex) c c++
- 컴파일 언어
자바의 컴파일러와 인터프리터
자바는 특별하게 컴파일과 인터프리터를 병행합니다.
- 자바 컴파일러는 .java 파일을 javac(java compiler)가 바이트코드로 쓰여진 .class 파일로 변환한다. 바이트코드는 JVM을 위한 언어입니다.
- 자바 인터프리터는 자바 컴파일러에 의해 변환된 클래스파일내의 바이트코드를 특정 환경의 기계에서 실행될 수 있도록 변환합니다.
JIT, 왜자바는 컴파일과 인터프리트를 병행하는가?
JIT 컴파일러는 Just In Time 컴파일러의 약자로, 인터프린터 방식과 컴파일러 방식을 혼합한 방식으로 정리할 수 있습니다. 실행 시점에는 인터프린터 형식으로 기계어 코드를 생성하고, 코드를 캐싱합니다.
다음과 같은 특징을 가집니다.
- 컴파일러의 경우 프로그램이 작성된 기계상에서 실행할 때 매우 효율적입니다.
- 하지만 인터프리터의 경우는 플랫폼에 종속 되지 않습니다.
- 자바 바이트코드는 컴퓨터와 프로그램 사이에 별도의 버퍼 역할을 수행합니다.(보안적 장점 + 성능적 장점)
JDK VS JRE
- JDK : Java Development Kit (자바 개발자 도구)
- JRE : Java Runtime Environment (자바 실행 환경)
자바 언어로 프로그램을 개발하기 위해서는 JDK를 설치하면 되고, 자바 언어로 작성된 프로그램을 실행하기 위해서는 JRE을 설치하면 됩니다.
마무리.
오늘은 자바의 기초, 그 처음 단계인 JVM에 대해서 정리했습니다. 잘못된 부분 있으면 알려주시면 감사합니다.
출처