JVM, JDK, JRE에 대해서 알아보자
JVM이란?
JVM이란 Java Virtual Machine을 줄인 것으로 영어를 해석하면 자바 가상 머신이다. 즉 자바를 실행하기 위한 가상 머신이라고 생각하면 된다. 자바를 사용해 개발을 하게 되면 JVM에서만 실행된다. 만약 JVM이 설치되어있지 않으면 자바로 작성한 파일들이 실행되지 않는다. 자바를 사용하기 위해서는 꼭 JVM이 필요하다.
C, C++와 같은 어어는 일반적으로 소스 코드를 네이티브 코드로 컴파일합니다. 소스코드가 기계어로 직접 변역되어 파일이나 라이브러리 파일로 생성되는 방식으로 사용합니다.
JVM을 사용하는 자바의 컴파일 및 실행 방식은 다른 언어와는 다릅니다. JVM은 자바 소스 코드를 바이트 코드로 컴파일하여 생성된 클래스 파일을 실행할 수 있도록 해석(Interpert)합니다. 이는 실행 시간에 이루어지며, 따라서 자바 프로그램은 실행되기 전에 기계어로 직접 번역되지 않는다는 차이점이 있습니다.
실행 시에 바이트 코드를 해석하는 방식은 초기에는 속도가 느릴 수 있지만, JVM은 JIT(Just-In-Time) 컴파일러와 같은 최적화 기술을 사용하여 바이트 코드를 실제로 실행하는 중간 과정에서 기계어로 변환하여 성능을 향상합니다.
또한, 자바의 장점 중 하나인 "Write once, run anywhere"는 JVM의 특성 덕분에 가능합니다. JVM은 각 운영 체제에 맞는 버전을 제공하여 자바 프로그램이 플랫폼 독립적으로 실행될 수 있도록 합니다. 따라서 자바 프로그램은 운영 체제에 독립적이며, 한 번 작성된 코드는 어느 운영 체제에서나 실행될 수 있습니다.
예제
notepad에 직접 test.java를 한다.
test.java
public class test {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
![](https://blog.kakaocdn.net/dn/br3J5g/btsFbT85adk/eQVnI0rIJKS9ZakeaJu69K/img.png)
javac test.java 명령어를 사용해
test.java 파일을 컴파일하여 바이트 코드로 변환된 test.class 파일을 생성합니다.
java test 명령어를 사용해 test.class 파일의 main() 메서드가 실행되면서 "Hello World"가 출력되는 것을 볼 수 있다.
JVM의 메모리 구조
- 메서드 영역(methdo area) : 사용될 클래스 파일(*. class)을 읽어서 메서드 영역에 저장합니다. 해당 클래스의 클래스 변수가 정의되어 있다면 클래스 변수도 함께 읽어서 저장합니다.
- 호출스택(call stack) : 메서드 실행 시 필요한 메모리 공간을 제공합니다. 메서드가 호출될 때마다 해당 메서드의 사용할 메모리를 할당하여 저장하고, 메서드 실행이 완료되면 자동으로 해당 메모리를 반환하여 공간을 비웁니다.
- 힙(heap) : 인스턴스가 생성되는 공간으로, 프로그램 실행 중에 생성되는 인스턴스와 인스턴스 변수가 함께 저장됩니다
예제
JVM_Memory_Structure.class
public class JVM_Memory_Structure {
public static void main(String[] args) {
first();
}
static void first(){
System.out.println("첫번쨰 메소드 실행");
second();
System.out.println("첫번쨰 메소드 종료");
}
static void second(){
System.out.println("두번째 메소드 실행");
System.out.println("두번쨰 메소드 종료");
}
}
다음과 같이 JVM Memory Structure.class 파일을 실행한다고 가정해 보자. 그럼 다음과 같이 JVM 메모리에 올라갈 것이다.
실행이 될 때는 다음과 같이 JVM 메모리가 적재될 것이다. 이제 사용을 사용을 하고 나면 적재의 역순으로 JVM 메모리에서 반납될 것이다.
실제 IDE로 실행해 보면 위와 같은 결과를 나오는 것을 볼 수 있다.
JDK, JRE
앞서 설명한 JVM의 예제를 IDE를 통해 사용하기 위해서는 JDK나 JRE를 설치해야 JAVA를 통해서 개발을 할 수 있다. 그럼 이 JDK와 JRE는 무엇일까?
먼저 그림으로 봐보자
JDK는 JRE-JVM + 개발도구 밀 유틸리티를 가지고 있는 최상위 도구이며,
JRE는 JVM과 자바표준 라이브로러리를 가지고 있는 도구이다.
JDK
JDK는 Java Development Kit의 약자로, 자바 애플리케이션을 개발하는 데 필요한 도구 모음입니다.
- 자바 컴파일러(javac):
- 자바 소스 코드를 바이트 코드로 컴파일(*. class)하는데 사용됩니다.
- 자바 실행기(java):
- 컴파일(*. class)된 파일을 실행하는 데 사용됩니다.
- 자바 문서 생성기(javadoc):
- 소스 코드 주석을 기반으로 API 문서를 생성하는 데 사용됩니다.
- 자바 디버거(jdb):
- 디버깅에 사용됩니다. 프로그램 실행 중에 오류를 찾고 수정할 수 있습니다.
- 기타 도구 및 유틸리티:
- 자바 개발에 도움이 되는 여러 도구와 유틸리티가 포함됩니다.
JRE
JRE는 Java Runtime Environment로, Java 애플리케이션을 실행하는 데 필요한 런타임 환경을 제공합니다.
- Java Virtual Machine(JVM):
- Java 어플리케이션을 실행하는 데 사용됩니다.
- 자바 런타임 라이브러리:
- 자바 프로그램이 실행 중에 사용하는 다양한 라이브러리와 클래스가 포함되어 있습니다.
정리
이번 포스팅에서는 JVM, JDK, JRE에 대해서 알아보았습니다. 그럼 JDK와 JRE에 JVM이 들어 있는데 어떤 걸 설치해야 할까? 고민이 들수도 있습니다.
만약 단순히 JAVA 애플리케이션을 실행만 하고자 한다면 간단하고 용량이 적은 JRE를 설치하는 것이 좋을 것입니다.
반면에 JAVA를 통해서 프로그래밍을 한다면 개발도구와 유틸리티를 제공하는 JDK를 설치해 개발의 용이한 환경을 만드는 것이 좋습니다.
'Java' 카테고리의 다른 글
[JAVA] 오버로딩(Overloading) 와 오버라이딩(Overriding)차이 (0) | 2024.02.23 |
---|