[Java] JVM (Java Virture Machine)
1. JVM이란?
C 프로그램의 실행 프로세스를 한 번 생각해보자.
- preprocessor를 거쳐 코드가 확장된다.
- 확장된 코드는 compiler를 통해 어셈블리 코드로 변환된다.
- 변환된 어셈블리 코드는 assembler를 통해 바이트 코드를 가진 .obj 파일로 변환된다.
- .obj 파일은 linker를 통해 외부의 라이브러리 코드와 연결시킨 후, 실행 파일(.exe 등)을 생성한다.
- 실행이 가능해진 코드는 loader를 통해 메모리에 로드되고, 기계는 이를 해석하며 그에 따라 동작한다.
C 프로그램은 위와 같은 프로세스를 머신에서 수행하고, Java는 가상머신을 이용해 이와 같은 프로세스를 처리한다.
JVM이 하는 일은 크게 3가지
- 코드를 로드하고, 검증하고, 실행한다.
- OS로부터 메모리를 할당받아 관리한다.
- 최종적으로 Java 프로그램이 실행될 수 있는 Runtime Enviroment를 제공해준다.
당연히, Java 프로그램이 실행되는 머신의 특성을 알면 퍼포먼스를 최대로 끌어낼 수 있게되겠지 ?
2. Java 프로그램의 실행 프로세스
Java 프로그램의 실행 프로세스를 살펴보자.
- .java 파일은 javac( java compiler )를 통해 바이트 코드를 가진 .class 파일로 변환된다.
- 변환된 .class 파일은 JVM을 거쳐 실행되는데, 이때 3가지 스텝을 밟는다.
1) Class Loader
2) Bytecode Verifier
3) Just-In-Time Compiler
JVM이 .class 파일을 실행하는 세 가지 단계에 대해서 알아보자.
1) Class Loader
main class가 가장 먼저 JVM에 의해 메모리에 로드된다. ( main class란 시작점인 main 메서드를 가지는 클래스 )
JVM에서는 두 가지의 클래스 로더가 존재하는데, 하나는 primordial이고, 다른 하나는 non-primordial이다.
primordial은 JVM에서 기본으로 제공하는 클래스 로더를 말하고, non-primordial은 사용자가 만든 클래스 로더를 말한다.
2) Bytecode Verifier
.class 파일이 클래스 로더에 의해 메모리에 로드되었다면, Bytecode Verifier는 해당 바이트 코드에 위험요소는 없는지 체크한다.
- 변수가 초기화되기 전에 사용되었는지
- 메서드 호출은 적절한 객체에 의해서 호출되었는지
- 로컬 변수가 런타임 스택공간을 벗어나는 접근을 하지는 않는지
- 런타임 스택공간이 오버플로우되지는 않는지
3) Just-In-Time Compiler
JIT 컴파일러는 로드된 바이트 코드를 기계어 코드로 변환하는 작업을 수행한다.
JVM 인터프리터의 경우 매번 코드를 해석하여 변환하는데 반면,
JIT 컴파일러는 같은 코드를 매번 해석하는 대신, 처음 실행될 때 인터프리트하면서 자주 쓰이는 코드를 캐싱하여 이를 재사용한다.
JIT 컴파일러보다는 JIT 인터프리터라는 용어가 더 적절하며, 인터프리터 언어가 성능 향상을 목적으로 도입하는 경우가 많다.
3. 참고자료
[1] https://www.geeksforgeeks.org/compilation-execution-java-program/
[2] https://asfirstalways.tistory.com/158
[4] https://betsol.com/java-memory-management-for-java-virtual-machine-jvm/
'Programming > Java' 카테고리의 다른 글
[Java] 테스트를 위한 환경 구성 (0) | 2020.05.28 |
---|---|
[Java] XML 파싱 (0) | 2020.05.13 |
[Java] try-with-resources로 쉽게 자원해제하기 (0) | 2020.04.17 |
[Java] NIO (0) | 2020.04.17 |
[Java] Atomic Type (0) | 2020.04.13 |
댓글
이 글 공유하기
다른 글
-
[Java] 테스트를 위한 환경 구성
[Java] 테스트를 위한 환경 구성
2020.05.28 -
[Java] XML 파싱
[Java] XML 파싱
2020.05.13 -
[Java] try-with-resources로 쉽게 자원해제하기
[Java] try-with-resources로 쉽게 자원해제하기
2020.04.17 -
[Java] NIO
[Java] NIO
2020.04.17