JVM
JVM은 '자바 가상 머신(Java Virtual Machine)'의 줄임말이다.
가상 머신이란 소프트웨어로 구현된 하드웨어를 뜻하는 넓은 의미의 용어이다.
쉽게 생각하면 실제 컴퓨터(하드웨어)가 아닌 소프트웨어로 구현된 컴퓨터이므로 컴퓨터 속의 컴퓨터라고 생각하면 된다.
따라서 자바 가상 머신은 자바를 실행하기 위한 컴퓨터 속의 컴퓨터(가상 머신)인셈이다.
자바로 작성된 애플리케이션을 실행하기 위해서는 반드시 JVM이 필요하다.
Java 애플리케이션 ◀ | ▶ JVM ◀ | ▶ OS ◀ | ▶ 컴퓨터(하드웨어) |
일반 애플리케이션 ◀ | ▶ OS ◀ | ▶ 컴퓨터(하드웨어) |
일반적인 애플리케이션은 OS만 거치고 바로 하드웨어로 전달되지만 Java로 작성된 애플리케이션은 JVM을 한번 더 거치기 때문에 속도가 느리다는 단점이 있다.
요즘에는 바이트코드(컴파일된 자바코드)를 하드웨어의 기계어로 바로 변환해주는 JIT컴파일러와 향상된 최적화 기술이 적용되어 속도의 격차는 많이 줄었다.
여기서 JIT(Just In Time)컴파일러는 실행 시점에 기계어 코드를 생성한다. 같은 코드가 반복된다면 매번 기계어 코드를 새로 생성하지 않고 이전에 만든 기계어를 재사용한다. 또한 운영체제에 맞게 바이트 실행 코드로 한 번에 변환하여 실행하기 때문에 이전의 자바 해석기(Java interpreter) 방식보다 성능이 10~20배 좋다.
이렇게 자바 애플리케이션은 JVM을 거쳐야 하므로 느리다는 단점이 있지만 이로 인해 오는 장점은 운영체제에 독립적이라는 것이다.
일반 애플리케이션은 서로 다른 OS에서 실행시키기 위해서는 해당 OS에 맞게 변경해야하지만 Java로 작성된 애플리케이션은 JVM하고만 상호작용을 하기 때문에 서로 다른 OS라고 해도 변경하지 않고 실행이 가능하다. (단, JVM은 OS에 종속적이기 때문에 OS별로 실행 가능한 JVM이 필요하다.)
JVM의 메모리 구조
JVM의 메모리 구조는 위의 그림과 같다. 응용프로그램이 실행되면, JVM은 시스템으로부터 프로그램을 수행하는데 필요한 메모리를 할당받고 이 메모리들의 용도에 따라서 여러 영역으로 나누어 관리한다. 이렇게 할당받은 메모리 공간을 그림으로 표현하면 아래 그림과 같다.
1. 호출 스택 (Call Stack)
호출 스택은 메소드의 작업에 필요한 메모리 공간을 제공한다. 메소드가 호출되면 해당 메소드를 위한 메모리가 할당되어 메소드 작업에 필요한 매개변수, 지역변수 등이 저장된다. 메소드의 작업이 끝나면 할당된 메모리 공간은 반환된다.
2. 힙 (Heap)
프로그램 실행 중에 생성되는 인스턴스는 Heap에 생성된다.
3. 메소드 영역 (Method Area)
프로그램 실행 중에 사용되는 클래스의 클래스 파일(*.class)을 JVM이 분석하여 해당 클래스에 대한 정보를 메소드 영역에 저장한다.
참조
https://asfirstalways.tistory.com/158
'개발 > Java' 카테고리의 다른 글
[Java] Java - 자바 관련 이것저것 (Overriding, Singleton, Serializable, Comparable, Comparator 등등) (0) | 2022.03.22 |
---|---|
[Java] 자바 BufferedWriter를 이용한 int형 출력 (0) | 2021.11.27 |
[Java] 자바 컬렉션 시간복잡도 (Collection Time Complexity) (0) | 2021.10.30 |
[Java] 자바 String, StringBuffer, StringBuilder 차이 (0) | 2021.10.24 |