java 소스가 class가 되는 과정
- java 소스를 작성하여 실행이 되는 파일로 만드는 과정이다.
- java를 cmd창이나 터미널에서 실행해봤다면 javac를 통해 class파일을 만들어 본 경험이 있을텐데 개발툴로만 자바 소스를 접해본 사람은 이런 과정이 이해가 안될 수 있다.
- class파일을 만드는 이유는 개발자가 os를 신경쓰지 않고 java 코드로만 코딩했을 때 jvm이라는 것을 활용하여 os에 맞게 코드를 변형시키기 위한 과정 중 jvm이 java코드를 더 알아보기 쉽게 만들기 위한 작업이다.
class가 os에서 실행되는 과정
- 이제 class파일을 만들었으니 java로 실행했을 때 java가 어떻게 처리해줄까에 대한 과정이다.
- class 파일을 Class Loader가 읽어들여서 java에서 사용하기 쉽도록 Runtime Data Area라는 곳에 정렬해둔다.
- Runtime Data Area는 java가 os로부터 할당받은 jvm의 메모리 영역이라고 생각하면 된다.
- Runtime Data Area에 정리된 소스들에서 실행이 되어야하는 메서드 소스들을 Execution Engine에서 os에서 이해할 수 있는 기계어로 번역하여 실제 실행
- 이렇게 실행되어지고 참조되어지는 소스들을 제외한 나머지 소스들은 Garbage Collector에서 확인하여 메모리에서 삭제
그렇다면 Runtime Data Area에는 Class Loader가 어떤식으로 적재시켜놓는 것이고 어떻게 Excution Engine에서 사용하는 걸까?
Runtime Data Area
Runtime Data Area는 크게 5가지로 분류합니다.
- Meathod Area
- 클래스 멤버 변수 이름, 데이터 타입, 리턴 타입, 상수풀, static 변수 등이 저장됨
- Heap Area
- new 키워드로 생성된 객체들이 생성되는 영역, method area에 로드된 클래스만 생성 가능하고 GC가 참조되지 않는 메모리를 확인하고 제거하는 영역
- Stack Area
- 지역 변수, 파라미터, 리턴 값, 연산에 사용되는 임시 값들을 저장하는 영역
- PC Register
- Thread가 생성될 때마다 생성되는 영역으로 Program Counter를 가지고 있는 영역이다. 현재 Thread가 실행되는 부분의 주소와 명령을 저장하는 것으로 현재 활성화되어 실행중인 곳을 가리키는 커서와 같은 것이 있는데 이는 Program Counter(프로그램 카운터)라고 한다.
- Native Method Stack
- 자바는 하드웨어를 직접 제어하지 못해 C언어와 같은 다른 언어의 기능을 빌려 써야할때가 있는데 이때 사용하는 것이 JNI(Java Native Interface)기술이다. 여기서 사용되고 기록하는 영역이 바로 네이티브 메서드 스택이다.
- 여기서 java 소스를 실행하기 위해 Thread가 생성되어 졌을 때 Method Area와 Heap Area는 모든 Thread가 공유하고 Stack, PC Register, Native Method는 각각의 Thread마다 생성되어지고 공유되진 않는다.