[리마인드] 자바 - JVM
1. 개요
앞선 포스팅에서도 언급했듯 간략히 말씀드리자면, JVM은 Java Virtual Machine으로, 각각의 OS 바로 위에서 작동하는 JVM 코드 즉, 바이트코드를 읽어들이고 수행하는 역할을 담당한다. Java 컴파일러는 개발자가 작성한 소스코드를 컴파일하게 된다. 이때 바이트 코드로 컴파일되며, 각각의 OS 환경에 맞게 컴파일된다.
이로써 개발자는 OS에 제한을 받지 않고, 동일한 코드로 개발할 수 있게된다.
2. JVM의 구조
JVM은 다음과 같이 구성되어있다.
1. Class Loader
컴파일된 바이트 코드가 JVM에 들어오면, 제일 먼저 오는 곳이다. 바이트 코드를 Runtime Data Area 즉, 자바의 메모리에 적재하는 역할을 담당한다.
2. Runtime Data Area (Java Memory)
자바의 메모리라고도 하며, 다음과 같이 구성되어 있다. 공통 영역의 Method Area, Heap Area, 스레드 별로 Stack Area, PC Register, Native Method Area가 있다.
※ Method Area
각 클래스 별로 전역변수, 지역변수, 메서드 등이 들어가는 영역이다.
※ Heap Area
런타임 중 데이터나 객체가 동적으로 할당되는 영역이다.
※ Stack Area
함수에 대한 정보가 들어가는 영역이다.
※ PC Register
현재 수행중인 JVM 명령어들을 가지고 있다.
※ Native Method Stack
자바라고 해서 모두 자바로만 동작하지 않는다. C언어 등 다른 언어의 메소드를 가져와서 사용하기도 한다. 이때 Native Method Stack 영역은 자바 이외의 언어로 작성된 코드들이 들어가 있다.
3. Execution Engine
로딩된 바이트 코드가 실행되는 곳이다.
3. 자바 어플리케이션 동작 과정
1. 개발자가 소스코드를 작성한다 (~.java 파일)
2. 자바 컴파일러가 바이트코드로 컴파일한다. (javac)
3. JVM이 읽을 수 있는 바이트 코드가 만들어진다. (~.class 파일)
4. JVM의 Class Loadaer에 도달하고, 이는 자바의 메모리 영역에 할당된다.
5. JVM의 Method Area, Heap Area, Stack Area, PC Register, Native Method Stack 영역에 클래스의 정보가 각각 할당된다.
6. Execution Engine에 의해 프로그램이 실행된다.
4. 정리
JVM의 메모리 영역에는 스레드 공통으로 Method Area, Heap Area, 스레드별로 Stack Area, PC Register, Native Method Stack이 있다. PC Register는 현재 수행중인 명령어들이 들어가 있고, Stack Area는 호출된 메소드의 매개변수, 지역변수, 리턴정보 등이 저장된다. Native Method Stack 자바 이외의 언어들이 수행되도록 하는 영역이고, Method Area는 클래스별로 전역변수, 정적변수, 메소등 정보들이 저장된다. Heap Area는 런타임 중 생성되는 객체들이 동적으로 할당되는 곳이다.
긴 글 읽어주셔서 감사합니다! 잘못된 내용이 있거나 보충할 내용이 있다면 언제든지 댓글 부탁드립니다!
참고영상) '개발자 장고'님 유튜브