티스토리 뷰
728x90
반응형
JVM이란?
- JVM이란 Java Virtual Machine의 약자로 자바를 실행하기 위한 가상 기계라고 할 수 있습니다.
- 자바로 작성된 애플리케이션은 모두 JVM에서만 실행되기 때문에 자바 애플리케이션을 실행하기 위해서는 반드시 JVM이 필요합니다.
- Java Compiler는 JVM이 인식할 수 있도록 .java 파일을 .class라는 'Java Byte Code'로 변환 시켜줍니다.
- 💡 여기서 Java Compiler는 JDK를 설치하면 bin 폴더에 있는 javac.exe 파일을 말합니다. (즉 , JDK에 Java Compiler가 포함되어 있습니다.)
- Java Compiler에 의해 변환된 Java Byte Code는 기계어가 아니기 때문에 OS에서 바로 실행될 수 없습니다. 이때 JVM이 OS가 Java Byte Code를 이해할 수 있도록 해석을 해줍니다. 그렇기 때문에 Java Byte Code는 JVM 위에서 OS의 상관없이 어느곳에서나 실행될 수 있습니다.
컴파일 하는 방법
- 아래의 예제는 Java Compiler에 의해 .java 파일을 .class 라는 Java Byte Code로 변환하는 과정입니다.
- Java Compiler는 JDK를 설치하면 JDK의 bin 폴더 내부에 javac.exe라는 실행파일로 존재합니다.
- Java Compiler의 javac 명령어를 통하여 .java 파일을 .class 파일로 생성할 수 있습니다.
Step 01 - 예제 파일 생성
public class Example {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
Step 02 - 해당 디렉토리로 이동하여 javac 명령어 실행
C:\Users\해당 디렉토리>javac Example.java
실행하는 방법
- java 명령어를 사용하여 .class 파일을 실행시킬 수 있습니다.
- 💡 JDK 디렉토리의 bin 폴더에 java.exe라는 실행 파일이 있는데 해당 파일은 JVM을 실행시키기 위한 명령 프로그램입니다.
- java 명령어로 JVM을 실행시킬 수 있습니다.
- 저는 cmd에서 Error: Could not find or load main class (클래스 이름) 이라는 예외가 발생하여 패키지를 전체 묶어서 다시 진행 하였습니다.
바이트코드란 무엇인가
- Java Byte Code란 JVM이 이해할 수 있는 언어로 변환된 자바 소스코드를 의미합니다. 자바 컴파일러에 의해 변환된 코드의 명령어 크기가 1 byte라서 Java Byte Code라고 불리고 있습니다. 또한 이러한 자바 바이트 코드의 확장자는 .class입니다.
- 위의 말을 쉽게 표현하자면 JVM이 자바 바이트 코드를 읽어서 컴퓨터가 이해할 수 있는 언어로 변환하는것이다.
- Java Byte Code는 JVM이 설치되어 있으면 어떠한 운영체제에서라도 실행될 수 있습니다.
JIT 컴파일러란 무엇이며 어떻게 동작하는가
- JVM에 Java Byte Code가 전달되면 JVM은 전달 받은 Byte Code를 실행하게 되는데 이때 바이트 코드를 실행하는 과정에서 JVM은 JIT 컴파일을 통해 바이트 코드를 기계어로 변환합니다.
- 컴퓨터 프로그램을 만드는 방법은 크게 두가지로 나누어 살펴 볼 수 있는데 첫번째는 정적 컴파일 방식이고 두번째는 인터프리터 방식입니다.
Case 01 - 정적 컴파일 방식이란?
- 대표적인 예인 C나 C++에서는 프로그램을 실행하기 전에 한번에 컴파일과정을 수행합니다.
Case 02 - 인터프리터 방식이란?
- JavaScript 같은 인터프리터 언어들은 프로그램을 실행할 때 코드를 읽어가면서 그에 대응하는 기계어 코드를 생성합니다.
그래서?
- 인터프리터 언어는 Runtime 상황에서는 인터프리터가 한 줄씩 읽고 실시간으로 실행하기 때문에 컴파일 언어에 비해 속도가 느립니다.
- 컴파일 언어는 소스코드를 기계어로 변환하는 빌드 과정에서 인터프리터 언어에 비해 시간은 소요되지만 Runtime 상황에서는 이미 기계어로 변환되어 있기 때문에 빠르게 실행할 수 있습니다.
Case 03 - 그렇다면 JIT이란 무엇일까?
- JIT 컴파일(Just-In-Time compilation)은 위의 두가지 방법을 혼합한 것으로 JIT 컴파일러는 바이트 코드를 읽어서 빠르게 기계어로 변환합니다.
- JIT 컴파일러는 프로그램을 실행하는 과정에서 필요한 부분만 기계어로 변환하고, 기계어로 변환된 부분은 캐시에 저장해서 재사용시 컴파일을 다시 할 필요가 없게됩니다. 때문에 일반적인 인터프리터 방식보다 빠릅니다.
JVM의 구성 요소
JVM의 구성 요소를 크게 나누면 다음과 같은 요소로 구성됩니다.
클래스 로더(class loader)
- Java 컴파일러가 .java 파일을 컴파일하면 .class파일이 생성이 되는데 이렇게 생성된 .class 파일을 엮어서
Runtime Data Area 형태로 메모리에 적재하는 역할을 합니다.
실행 엔진(Execution Engine)
- 클래스를 실행시키는 역할을 수행합니다.
- 클래스 로더가 JVM내의 Runtime Data Area영역에 바이트 코드를 배치시키고 이것들은 실행 엔진에 의해 실행됩니다.
- 자바 바이트 코드(.class)는 기계가 바로 수행할 수 있는 언어보다는 비교적 사람이 보기 편한 형태로 기술되어 있는데 그래서 실행 엔진은 이와 같은 바이트 코드를 JVM 내부에서 기계가 실행할 수 있는 형태로 변환합니다.
가비지 콜렉터(Garbage Collector)
- Heap 메모리 영역에 생성된 객체들 중에 더이상 사용되지 않는 인스턴스를 찾아 메모리에서 삭제합니다.
JDK와 JRE의 차이
JDK란? (Java Development Kit: 자바 개발 키드)
- JDK는 개발을 위해 필요한 도구(javac, java 등)들을 포함하고 있습니다.
- JDK는 JRE를 포함하고 있습니다.
- 즉 JDK = JRE + @라고 생각할 수 있습니다.
JRE란? (Java Runtime Enviroment: 자바 런타임 환경)
- JRE는 JVM이 자바 프로그램을 동작시킬 때 필요한 라이브러리 파일들과 기타 파일들을 가지고 있습니다.
- JRE는 JVM의 실행환경을 구현했다고 할 수 있습니다.
- 자바 프로그램을 실행시키기 위해서는 반드시 JRE가 필요합니다.
728x90
반응형
'JAVA > JAVA기본' 카테고리의 다른 글
JAVA - 리플렉션 (Reflection)이란? (0) | 2021.11.28 |
---|---|
JAVA - Garbage Collection이란? (0) | 2021.11.28 |
JAVA - 이미지 base64를 디코딩하여 파일 생성 후 DB에 디렉토리 저장 (0) | 2021.07.13 |
JAVA - 클래스 멤버(static)와 객체 멤버(인스턴스) (0) | 2021.06.26 |
JAVA - main 메서드의 용도 (0) | 2021.06.25 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- spring boot redis 대기열 구현
- spring boot excel download oom
- redis 대기열 구현
- space based architecture
- @ControllerAdvice
- spring boot redisson 분산락 구현
- java ThreadLocal
- 자바 백엔드 개발자 추천 도서
- service based architecture
- redis sorted set
- spring boot redisson sorted set
- spring boot excel download paging
- transactional outbox pattern spring boot
- 트랜잭셔널 아웃박스 패턴 스프링부트
- spring boot poi excel download
- 서비스 기반 아키텍처
- polling publisher spring boot
- spring boot 엑셀 다운로드
- transactional outbox pattern
- 레이어드 아키텍처란
- redis sorted set으로 대기열 구현
- JDK Dynamic Proxy와 CGLIB의 차이
- 트랜잭셔널 아웃박스 패턴 스프링 부트 예제
- 공간 기반 아키텍처
- pipe and filter architecture
- spring boot redisson destributed lock
- pipeline architecture
- java userThread와 DaemonThread
- 람다 표현식
- microkernel architecture
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함