JVM과 Javac가 어떤건지 어떤식으로 구성되고 동작하는지에 대해 아냐고 여쭤보셨다. 물론 JVM은 무엇이고 어떤식으로 동작하는지 안다. "대충"말이다. JVM은 Java Virtual Machine이며 자바 컴파일러가 한번 더 변환한다는 정도다.
- 자바 소스 파일은 자바 컴파일러(Javac)에 의해 바이트 코드로 변환된다.
- 이러한 바이트코드(.class)를 JVM이 읽어 실행한다.
- JVM을 통해 실행하기 때문에 어떤 운영체제든 Java파일을 실행할 수 있다.
1. JVM은 운영체제에 종속적이다.
리눅스에서 만든 파일을 윈도우에서 실행하고 싶다면, 윈도우용 JVM을 설치만 하면 된다!
2. JVM의 구조는 크게 4가지로 나눌 수 있다.
Garbage Collector, Execution Engine, Class Loader, Runtime Data Area로 나눌 수 있다.
2.1 Class Loader
- .java 소스를 자바 컴파일러가 컴파일 하면 .class(바이트코드)가 생성된다.
- 이렇게 생성된 클래스 파일들을 엮어서 Runtime Data Area로 적재하는 역할을 한다.
2.2 Execution Engine
- Class Loader에 의해 적재된 클래스들을 기계어로 변경해 명령어 단위로 실행한다.
2.3 Garbage Collector
- Heap 메모리 영역에 생성된 객체들 중에 참조되지 않는 객체들을 탐색 후 제거하는 역할을 한다.
- GC가 수행되는 동안 GC를 수행하는 쓰레드가 아닌 다른 모든 쓰레드가 일시정지된다.
- GC가 언제 역할을 하는지 정확히 알 수 없다. (참조가 없어지자마자 해제되는 것을 보장하지 않음)
2.4 Runtime Data Area
- JVM의 메모리 영역.
- 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역이다.
- Method Area, Heap Area, Stack Area, PC Register, Native Method Stack으로 나뉜다.
- 아래에서 자세히 설명하겠다!
3. Runtime Data Area의 구조
3.1 Method Area
- 클래스 멤버 변수의 이름, 데이터 타입, 접근제어자 정보같은 필드 정보와 메소드 이름, 리턴 타입, 파라미터, 접근 제어자 정보같은 메소드 정보, 타입 정보(Interface / class), Constant Pool(문자 상수, 타입, 필드, 객체 참조 저장), static 변수, final class 변수 등이 생성되는 영역
3.2 Heap Area
- new 키워드로 생성된 객체와 배열이 생성되는 영역.
- 메소드 영역에 로드된 클래스만 생성 가능
- Garbage Collector가 참조되지 않는 메모리를 제거하는 영역
3.3 Stack Area
- 지역 변수, 파라미터, 리턴 값, 연산에 사용되는 임시 값 등이 생성되는 영역.
int a = 10;
이라면 Stack에 이름이 a라고 붙여진 값이 10인 메모리 공간을 만든다.Person p = new Person();
이라면 Person p는 Stack에 생성, new로 생성된 인스턴스는 힙 영역에 생성된다.3.4 PC Register
- Thread가 생성될 때마다 생성되는 영역, Program Counter
- 현재 Thread가 실행되는 부분의 주소와 명령을 저장하고 있는 영역이다.
3.5 Native method stack
- 자바 외 언어로 작성된 native code를 위한 메모리 영역
Thread가 생성되었을 때 기준으로
- 메소드 영역, 힙 영역은 모든 Thread가 공유
- Stack, PC Register, Native method stack은 각각의 Thread마다 생성, 공유되지 않는다.
어느정도 알던 것도 있고 완전히 새로이 알게 된 내용들도 있다.
이번엔 JVM의 구조에 대해서 알아보았다.
다음번엔 Java의 특성과 장단점, 그리고 사용했을 시 기대할 수 있는 효과에 대해 알아보겠다.
위 내용 및 사진은 다음 블로그를 보고 정리하였습니다.