일반 프로그램은 운영체제가 프로그램을 실행시키는 반면,
자바 프로그램은 운영체제가 JVM을 실행시키면 JVM이 프로그램을 실행시킵니다.
여기서 JVM이란 자바 가상머신으로,
자바 프로그램의 클래스 파일들은 운영체제에서 직접 동작하는게 아니라 이 JVM위에서 동작하는데요.
이로 인해 운영체제에 적합한 JVM을 설치하기만 한다면 자바 프로그램은 어떤 운영체제에서든 실행 시킬 수 있습니다.
이 JVM의 구조는 크게 Class Loader, GC, Execution Engine, Runtime Data Area로 나눠집니다.
Class Loader에 대해 먼저 설명해보자면 java컴파일러(javac.exe)가 .java파일을 컴파일 하면 .class파일(바이트코드)이 생성됩니다. 이렇게 생성된 클래스 파일들을 엮어 Runtime Data Area형태로 메모리에 적재하는 역할을 수행합니다.
Run Time Data영역은 실제 클래스 파일이 배치되는 곳으로 자바 프로그램을 실행하기 위해서 JVM이 운영체제로부터 메모리에 데이터 및 명령어를 저장할 공간을 할당받는 곳입니다. 5개의 영역으로 구분되지만 주로 메서드, 힙, 스택 영역이 언급됩니다.
이 Runtime Data Area의 영역들에 대해 짧게 설명해보자면 다음과 같습니다.
먼저 메소드(클래스 또는 static) 영역은 프로그램의 흐름을 구성하는 바이트 코드가 로드되는 곳으로 JVM이 시작될 때 생성됩니다. 클래스 정보(멤버 변수의 이름), 변수정보, 메소드 정보, static변수, final class변수, Constant Pool등을 분류해서 저장하며 모든 스레드가 공유할 수 있습니다.
스택 영역은 지역변수, 매개변수, 리턴값 등 연산에 사용되는 임시적인 값들이 생성되는 영역으로 메소드를 호출할때마다 개별적으로 스택이 생성되며 메서드 종료 시 영역에서 해제됩니다.
다음으로 힙 영역은 new ~()로 생성된 객체와 배열이 저장되는 영역으로,스택 영역과 달리 메소드 호출이 끝나고도 소멸되지 않으며 가비지 컬렉터에 의해 지워지기 전까지나 JVM이 종료 되기 전까지 저장됩니다. method area에 로드된 클래스만 생성이 가능합니다.
변수별로 정리하자면,
지역변수, 매개변수 : 스택 영역에 저장됨
인스턴스 변수 : 힙 영역에 저장됨
참조변수 : 스택 영역(주소값 저장) + 힙 영역(실제 데이터)
다음으로 메모리에 적재된 클래스들을 기계어로 변경해 명령어 단위로 실행시켜야 하는데, 이 역할을 Execution Engine(실행 엔진)이 수행합니다. 실행 방식으로 바이트 코드를 한줄씩 실행하는 인터프리터 방식과 자주 쓰는 코드를 기계어로 변환시켜 저장해서 사용하는 JIT방식이 있습니다.
GC는 Heap 메모리 영역에 생성된 객체들 중 더이상 사용하지 않는 객체들을 해제시키고 메모리를 반납하는 역할을 수행합니다.
이 JVM의 구조를 기반으로 자바프로그램의 구동원리에 대해 짧게 요약해보겠습니다.
개발자가 소스코드, 즉 .java확장자의 소스파일을 작성하고 자바 파일을 실행시키면,
컴파일러(javac.exe)가 .class확장자의 클래스 파일인 바이트 코드로 변환합니다.
Class Loader가 이 .class 파일들을 JVM으로 로딩합니다.
로딩된 이 .class파일들은 Execution Engine을 통해 해석되고
해석된 바이트 코드는 Runtime Data Area에 배치되어 실질적으로 수행이 이루어집니다.
참고하면 좋은 글 )
https://velog.io/@litien/JVM-%EA%B5%AC%EC%A1%B0
https://stophyun.tistory.com/37
https://pearlluck.tistory.com/10
'Language > Java' 카테고리의 다른 글
어노테이션 (0) | 2021.07.03 |
---|---|
GC에 대해 (0) | 2021.06.24 |
클래스 다이어그램 (0) | 2021.02.05 |
접근 제한자 4가지 (0) | 2021.02.04 |
Arrays.toString()메소드 (0) | 2021.02.01 |