-
배경
운영체제 시간에 .c파일이 컴파일, 링크, 로드를 거쳐 실행되는 흐름을 배웠다. java를 본격적으로 공부하면서 대강 비슷하게 실행되겠거니 하고 자세한 내용은 공부를 미뤘다. 이제 면접을 준비해야 하니 자세하게 공부하자^^
JVM이란?
JVM은 우리가 작성한 .java파일을 실행하기 위한 소프트웨어다. JVM 또한 하나의 소프트웨어이기 때문에 운영체제에 맞는 버전이 있다. 개발자는 정해진 java문법에 맞게 코드를 작성하고 이를 운영체제와 상호작용하여 프로그램을 실행시켜주는 건 JVM이 해주는 것이다!
JVM 동작 과정(큰그림)
- 문법에 맞는 .java파일을 작성한다
- Javac는 .java파일을 .class파일로 컴파일한다(텍스트를 바이트코드로 변환한다)
- .class파일을 실행한다(.class파일을 엮은 .jar파일을 실행한다)
- Class Loader는 .class파일을 메모리에 로드한다.
- 여기까지 무사히 통과하면 프로그램은 5파트 Runtime Data Area로 나뉘게 된다.
- Execute Engine이 바이트코드를 바이너리코드로 변환하여 프로그램이 실행된다.
Class Loader(클래스로더)
클래스로더는 JRE(자바런타임환경)의 일부이며 프로그램에 사용될 클래스를 메모리에 로드하는 역할을 맡는다. 이때 클래스는 한번에 메모리에 로드되지 않고 애플리케이션 동작 중에 필요할 때 동적으로 로드된다. JVM에 내장된 클래스로더는 여러 종류가 있고 그 동작과정을 자세하게 살펴보자.
Bootstrap Class Loader
자바 클래스는 클래스로더라는 클래스(java.lang.ClassLoader)가 로딩한다. 그렇다면 이 클래스로더는 누가 로딩할까? 스스로 존재하는 걸까? 이 역할을 하는 게 바로 부트스트랩 클래스로더다. 부트스트랩 클래스로더는 주로 자바의 내장 라이브러리 클래스를 로딩한다. 부트스트랩 클래스로더는 JVM코어의 일부고 low level언어로 짜여져 있다. 즉, 이 부분은 운영체제마다 다른 언어로 작성되어 있을 것이다.
Extention Class Loader
익스텐션 클래스로더는 각 jdk의 익스텐션으로 확장된 클래스를 로딩한다.
Applicatoin Class Loader
우리가 작성한 클래스를 로딩한다.
동작방식
우선 코드에 적힌 모든 클래스를 로드하고 시작하는 게 아닌 클래스가 필요할 때 동적으로 로드한다. 위에서 언급한 순서대로 부트스트랩을 이용해 먼저 찾고, 다음으로 익스텐션이, 마지막으로 애플리케이션이 클래스를 로딩하는 작업을 맡는다. 이때 마지막까지 로딩할 클래스를 못찾게 된다면 ClassDefFoundError 또는 ClassNotFoundException이 발생하게 된다.
Runtime Data Area
클래스의 바이트코드 검증이 유효하다면 이제 필요한 메모리를 할당한다. 이는 크게 5가지 영역으로 나뉜다.
- Method Area : 클래스의 메타정보를 포함한 static 변수를 위한 메모리 영역, jvm내에서 오직 하나
- Heap Area : 모든 인스턴스가 저장되는 메모리 영역, 마찬가지로 jvm내에서 오직 하나
- Stack Area : 스레드마다 갖게 되는 논리적 스택 메모리 영역, 메서드 지역변수를 저장한다.
- PC register : CPU의 레지스터 개념을 갖는 메모리 영역, 여기서 관리
- Native Method Stack : 자세히 공부 요망^^
Execution Engine
인터프리터와 JIT컴파일러를 포함하며 바이트코드를 바이너리코드로 변환하는 역할을 한다. 실행 엔진은 각각 대주제이므로 각자 모두 자세히 공부 요망.
약간 요약하면 JVM은 인터프리터를 이용해 런타임시에 바이트코드를 바이너리코드로 변환하며 작업을 수행한다. 다만, 이러한 런타임 인터프리팅은 성능에 큰 이슈를 가져와서 JIT엔진을 이용해 인터프리터가 하는 역할을 최적화하여 작업을 수행 한다.
- interpreter : 바이트코드를 바이너리코드로 변환 후 실행
- JIT : 실행 코드를 최적화
- GC : 메모리를 해제하는 역할
마치며
JVM 역시 운영체제가 수행하는 프로세스이며 이 프로세스는 마치 운영체제처럼 실행된다. 메모리영역 공부를 조금 더 보충하고 execution engine을 공부하면 마무리될 듯하다.
참고
www.baeldung.com/java-classloaders
www.protechbeach.com/java/basic-explanation-for-jvm-java-virtual-machine-architecture-with-diagram/
'java' 카테고리의 다른 글
컬렉션 정리 (0) 2021.05.10 Java Garbage Collector (0) 2021.05.10 BeanUtils copyProperties 사용법 및 주의사항 (0) 2021.05.04 JWT를 이용한 인증 (0) 2021.04.16 HashMap이란? (0) 2021.02.12