JVM은 Java Virtual Machine(자바 가상 기계)의 약자다. 이름은 기계지만 실제로는 소프트웨어다. 아마 JVM이 실질적인 CPU 역할을 하기 때문에 이런 명칭이 쓰였을 것이라 추정된다.
프로그램은 기본적으로 CPU 위에서 돌아간다. 따라서 C, C++의 경우 컴파일 결과 생성된 코드는 해당 CPU에서 바로 실행할 수 있다. 이런 코드를 네이티브 코드(native code)라 한다. 자바 소스코드(*.java)를 컴파일한 경우 생성되는 클래스 파일(*.class)은 CPU에서 직접 실행할 수 있는 코드가 아니다. 이 클래스 파일은 CPU 위에서 실행할 수 있게 하기 위한 중간 단계라고 할 수 있는 바이트 코드(byte code)로 이루어져 있다. 이 바이트 코드를 실행하기 위한 가상적인 CPU가 필요한데, 이 가상 CPU가 JVM이다.
이런 방식이 쓰이는 이유는 이식성 때문이다. 직접 native code를 생성하면 CPU에 종속적이지만, byte code를 생성하면 JVM에 종속적이므로 어떤 플랫폼이든 JVM만 있으면 실행할 수 있게 되는 것이다.
이처럼 JVM은 기본적으로 byte code를 실행하는 역할을 담당하는데, 그 역할을 위해 runtime linking과 garbage collection 기능을 지원한다.
runtime linking은 실행 클래스가 실행될 때 필요한 외부 class와 결합(linking)시키는 방식을 말한다. JVM에서 이 기능을 지원하기 때문에 여러 클래스로 구성되는 한 프로그램에서 한 클래스를 수정하면 전체를 다시 컴파일하는 것이 아니라 수정한 클래스만 재컴파일해도 된다는 장점을 갖는다.
garbage collection은 더이상 사용되지 않는 객체를 지우는 기능이다. 자바는 개발자가 직접 메모리에 접근할 수 없도록 설계되어 있고 메모리는 자바가 직접 관리한다. 객체 생성 시 자동적으로 메모리 영역을 찾아 할당하고, 사용이 완료되면 쓰레기 수집기(Garbage Collector)를 실행해 사용되지 않는 개체를 제거한다. 이는 프로그래머의 실수로 인한 ⒜메모리 누수 현상을 방지해 프로그래머의 부담을 덜어준다.
⒜메모리 누수(memory leaking): 컴퓨터 프로그램이 필요하지 않은 메모리를 계속 점유하고 있는 현상.
C 언어에서 동적 할당한 메모리를 free()로 해제하지 않아 발생하는 것이
대표적인 예다.
참고: https://javaiyagi.tistory.com/20
'Programming > Java' 카테고리의 다른 글
사용자 정의 예외 (0) | 2019.07.07 |
---|---|
예외 처리 (0) | 2019.07.06 |
Managed code (0) | 2019.07.04 |
IO 입출력 (0) | 2019.05.23 |
자바에서의 배열 선언 및 초기화 (0) | 2019.05.08 |