JAVA/Java의 정석

JVM이란? (Java Virtual Machine) JVM의 구조와 장점, 단점

JWonK 2023. 6. 16. 03:45
728x90
반응형

▶ JVM (Java Virtual Machine)


JVM은 'Java Virtual Machine'을 줄인 것으로 직역하면 '자바를 실행하기 위한 가상 기계'라고 할 수 있다.

자바로 작성된 애플리케이션은 모두 이 JVM에서만 실행되기 때문에, 자바 애플리케이션이 실행되기 위해서는 반드시 JVM이 필요하다.

 

Java 애플리케이션과 일반 애플리케이션의 비교

 

일반 애플리케이션의 코드는 OS만 거치고 하드웨어로 전달되는데 비해 Java애플리케이션은 JVM을 한 번 더 거치기 때문에, 그리고 하드웨어에 맞게 완전히 컴파일된 상태가 아니고 실행 시에 해석(interpret)되기 때문에 속도가 느리다는 단점을 가지고 있다. 그러나 요즘엔 바이트코드(컴파일된 자바코드)를 하드웨어의 기계어로 바로 변환해주는 JIT 컴파일러와 향상된 최적화 기술이 적용되어서 속도의 격차를 많이 줄였다.

 

위 그림에서 볼 수 있듯이 일반 애플리케이션은 OS와 바로 맞붙어 있기 때문에 OS종속적이다. 그래서 다른 OS에서 실행시키기 위해서는 애플리케이션을 그 OS에 맞게 변경해야한다. 반면에 Java 애플리케이션은 JVM하고만 상호작용을 하기 때문에 OS와 하드웨어에 독립적으로 다른 OS에서도 프로그램의 변경없이 실행이 가능한 것이다. 단, JVM은 OS에 종속적이기 때문에 해당 OS에서 실행가능한 JVM이 필요하다.

 

 

 

이렇게 함으로써 자바의 중요한 장점 중의 하나인 "Write once, run anywhere. (한 번 작성하면 어디서든 실행된다.)"이 가능하게 되는 것이다.

 

 

 

 

 

 

▶ JVM (Java Virtual Machine)의 구조


JVM은 크게 세 가지 주요 구성 요소로 구성된다. 클래스 로더(Class Loader), 실행 엔진(Execution Engine), 메모리 영역(Memory Areas)

 

 

1. 클래스 로더 (Class Loader)

: 클래스 로더는 JVM 내부의 부트스트랩 클래스 로더를 비롯하여 클래스 파일을 로드하고, 링크 및 초기화 작업을 수행한다. 클래스 로더는 필요한 클래스 파일을 찾고 동적으로 로드하여 실행 시에 클래스를 사용할 수 있도록 한다. 로드된 클래스는 JVM의 메모리 영역에 저장된다.

 

2. 실행 엔진 (Execution Engine)

: 실행 엔진은 JVM이 로드한 클래스 파일을 실행하는 역할을 담당한다. 실행 엔진은 바이트 코드를 기계어로 변환하고, 이를 실행하여 프로그램을 실행한다. 주요한 실행 엔진 구성 요소로는 인터프리터(Interpreter)와 JIT(Just-In-Time) 컴파일러가 있다. 인터프리터는 바이트코드를 한 줄씩 해석하고 실행하는 방식으로 동작하며, JIT컴파일러는 인터프리터가 반복되는 코드를 동적으로 기계어로 컴파일하여 실행 속도를 향상시킨다.

 

 

3. 메모리 영역 (Memory Areas)

: JVM은 다양한 메모리 영역을 갖고 있다. 이러한 메모리 영역은 Java 프로그램의 실행과 관련된 데이터와 자원을 저장한다. 주요한 메모리 영역으로는 메서드 영역(Method Area), 힙(Heap), 스택(Stack), PC 레지스터(Program Counter Register), 네이티브 메서드 스택(Native Method Stack)이 존재한다. 각 영역은 다음과 같은 역할을 수행한다.

 

  • 메서드 영역 (Method Area) : 클래스 정보, 상수 풀(Constant Pool), 메서드 코드 등의 정보를 저장한다.
  • 힙 (Heap) : 동적으로 생성된 객체와 배열을 저장한다. 가비지 컬렉션은 힙에서 불필요한 객체를 자동으로 정리한다.
  • 스택 (Stack) : 메서드 호출과 관련된 데이터를 저장한다. 스레드마다 별도의 스택이 생성되며, 메서드 호출 시에는 호출된 메서드의 프레임(Frame)이 스택에 추가된다.
  • PC Register : 현재 실행 중인 명령어의 주소를 저장한다.
  • 네이티브 메서드 스택 (Native Method StacK) : Java 외부에서 사용되는 네이티브 코드(C/C++)를 위한 스택을 저장한다.

 

이러한 구성 요소들이 함께 동작하여 JVM은 Java 프로그램을 실행하고, ,메모리 관리, 스레드 관리, 예외 처리 등의 다양한 기능을 제공한다. JVM은 Java의 이식성과 보안성을 높이는 데 중요한 역할을 수행한다.

 

 

 

 

 

 

JVM의 주요 장점


  1. 이식성 : JVM은 플랫폼에 독립적이므로, 한 번 작성한 자바 프로그램은 여러 운영체제와 장치에서 실행될 수 있다. JVM은 특정 운영체제에 종속되지 않고 중간 계층으로서 작동하기 때문에, 자바 프로그램은 운영체제에 구애받지 않고 이식성을 갖는다.
  2. 메모리 관리 : JVM은 가비지 컬렉션(Garbage Collection)을 통해 자동으로 메모리를 관리한다. 개발자는 메모리 할당과 해제를 명시적으로 다룰 필요가 없으며, 메모리 누수와 같은 문제를 줄일 수 있다.
  3. 보안 : JVM은 자바 프로그램을 보호하는 여러 가지 보안 기능을 제공한다. 바이트코드의 검증, 클래스 로딩시 보안 검사, 액세스 제어 등의 기능을 통해 안전한 실행 환경을 제공한다.
  4. 동적 로딩 : JVM은 동적 클래스 로딩을 지원한다. 이를 통해 프로그램이 실행 중에 필요한 클래스를 동적으로 로드하고 사용할 수 있다. 이는 유연성과 확장성을 높여준다.

 

 

 

 

 

 

 JVM의 주요 단점


  1. 실행 속도 : JVM은 인터프리터와 JIT(Just-In-Time) 컴파일러를 사용하여 Java 바이트코드를 기계어로 변환한다. 이러한 변환 과정은 초기 실행 시간이 필요하며, 일부 언어와 비교하여 상대적으로 실행 속도가 느릴 수 있다. 그러나 최적화된 JIT 컴파일러를 사용하면 이러한 성능 문제를 상당부분 해결할 수 있다.
  2. 메모리 사용량 : JVM은 자체적인 메모리 사용량이 상대적으로 크다. JVM 자체의 오버헤드 및 가비지 컬렉션 작업에 필요한 추가적인 메모리를 사용하기 때문에, 자원이 제한적인 환경에서는 부담이 될 수 있다.
  3. 시작 시간 : JVM은 초기화 및 클래스 로딩 등의 작업이 필요하므로, 프로그램의 시작 시간이 상대적으로 오래 걸릴 수 있다. 특히 작은 규모의 애플리케이션의 경우, 이러한 시작 시간이 부담이 될 수 있다.
  4. 리소스 관리 : 가비지 컬렉션은 자동으로 메모리를 관리하지만, 이로 인해 일시적인 정지나 실행 속도 저하가 발생할 수 있다. 특히 대규모 및 실시간 시스템에서는 이러한 리소스 관리 문제가 중요한 고려 사항이 될 수 있다.

 

 

JVM은 Java의 큰 장점인 이식성, 자동 메모리 관리, 안정성 및 풍부한 라이브러리 생태계를 제공하지만 실행 속도, 메모리 사용량, 시작 시간 및 리소스 관리와 같은 일부 단점이 존재한다.

728x90
반응형