JDK( Java Develoment Kit )
JDK는 자바 컴파일 도구(javac) , 자바 실행 환경 ( JRE ) , 자바 실행 머신 ( JVM )이 합쳐진 도구이다. JAVA 언어로 개발하려면 JDK가 필요하지만 단순히 실행만 한다면 JRE만 있어도 된다.
그럼 이제 JDK는 어떻게 동작하는지 구체적으로 알아보자.
객체지향언어, JAVA
C,C++은 절차지향언어지만 JAVA는 객체지향언어이다.
절차지향언어는 코드의 '순서'가 중요하므로 코드 전체가 유기적으로 연결되어 있다. 그래서 메모리에 올라갔을 때의 주소도 논리적으로 이미 정해져 있다. 이를 '정적바인딩'이라 부른다. C,C++은 컴파일(compile)을 하면 컴퓨터가 이해할 수 있는 언어인 어셈블리어로 바로 변환된다. 이미 메모리 위치까지 지정되어 있으니 바로 실행이 가능하기 때문이다.
반면 JAVA는 다르다.
객체지향언어는 객체가 필요할 때 '동적'으로 호출한다.
JAVA 소스는 자바 컴파일러(javac)에 의해 바이트 코드로 구성된 클래스 파일로 변환된다. Maven이나 Gradle 같은 빌드툴을 이용하면 하나의 프로젝트는 배포가 가능한 클래스 묶음인 jar로 만들어진다. 그리고 jar는 디스크에 저장된다.
바이트 코드는 바로 실행가능한 어셈블리어가 아니다.
언제 어떻게 호출될지 모르는 객체지향언어의 특성상 논리적으로 메모리 위치가 정해져 있지 않으므로, 어셈블리어가 아닌 중간 단계의 형태를 유지하는 것이다. 그러다가 JVM 안의 클래스 로더에 의해, JVM 메모리(Runtime Data Area)에 올라가면 인터프리터에 의해 기계어로 번역되어 실행된다. 메소드 호출이 잦다면 JIT(Just In Time) 컴파일러에 의해 번역된다.
이처럼 JAVA는 객체지향언어이기 때문에, 중간단계인 바이트 코드 형태를 거치고, 이를 실행할 JVM이 필요하다.
중간 과정을 거치기에 C, C++보다 속도가 느리다는 단점이 있지만 JVM이 설치되어 있다면 어느 환경에서도 jar 파일은 실행될 수 있다. ( JVM이 환경별로 달라야 하긴 하지만 말이다. ) C,C++은 환경별로 컴파일을 따로 해주어야 한다. CPU는 종류별로 메모리 접근방식이 모두 다르다. 컴파일 과정에서 논리적인 메모리 주소를 미리 고정해놓기에, CPU가 달라지면 실행되지 않는 것이다.
JDK 동작원리
JDK는 자바 컴파일러로 자바 소스를 바이트 코드로 이루어진 클래스 파일로 컴파일한다. 복잡한 Java 프로젝트는 빌드툴(Gradle/Maven)의 도움을 받아 jar파일로 변환한다.
Disk에 존재하는 JAR 안의 클래스 파일은 JVM의 클래스 로더에 의해 동적호출되어, JVM 프로세스의 메모리 영역인 Runtime Data Area에 할당된다. 이때 바이트 코드로 이루어진 명령어는 Method Area에 저장된다. 그리고 프로그램이 실행되면, 명령어는 실행 엔진에 의해 해석되어 기계어로 변환된다. 자주 호출되는 바이트 코드 명령어는 JIT컴파일러가 동작하여 기계어로 변환해놓는다. 그래야 반복적으로 인터프리터에 의해 번역되는 경우를 방지할 수 있다.
CPU에 처리되는 단위는 스레드이다. 스레드는 JVM 메모리에서 독립적인 영역을 가진다. 독립적인 메모리 영역을 가지면 CPU의 처리단위가 될 수 있다. 스레드 단위로 처리되는 데이터는 Stack 영역에, 객체는 공용영역인 Heap 영역에 생성된다. JVM은 다수의 스레드가 동작하므로, 각각의 스레드마다 다음에 수행할 명령어의 위치를 저장해놓아야 한다. 그 공간이 PC Register이다. Native Method Stack은 JAVA가 아닌 C/C++ 같은 네이티브 언어로 작성된 메소드가 실행될 때, 프레임이 쌓이는 공간이다. 스레드의 일반 Stack은 JAVA 언어 메소드의 프레임이 쌓이는 공간이다.
참고자료
'JAVA > JAVA Basic' 카테고리의 다른 글
[JAVA] String, StringBuffer, StringBuilder의 차이 (0) | 2024.02.23 |
---|---|
[JAVA] Garbage Collector 동작원리 (0) | 2024.02.23 |
[JAVA] 어노테이션( Annotation )의 속성 (0) | 2023.05.29 |
[JAVA] 어노테이션( Annotation )이란? (0) | 2023.05.29 |
[ JAVA ] InputStreamReader : 인코딩 (0) | 2021.07.12 |