728x90
JDK (Java Development Kit)
- Java 개발 키트로, JVM, JRE와 개발을 위한 핵심 라이브러리를 갖고 있는 키트이다
- JRE를 포함해 컴파일러, 디버거 등의 개발 도구를 포함하고 있다
- 참고로 Java 8 버전 이후의 JDK는 유료화가 되어 보통 Java 개발 환경이 Java 8에 머무르고 있다고 한다
JRE (Java Runtime Environment)
- JRE는 자바 구동 환경으로, 시스템 라이브러리와 JVM을 포함한다
- 바이트 코드로 컴파일된 자바 코드를 실행하는 환경을 말한다
- JVM은 단독으로 설치할 수 없고, JRE가 JVM을 담고 있다
- JVM과 시스템 라이브러리를 이용하여 컴파일 된 자바 코드(바이트 코드)를 실행한다
JVM (Java Virtual Machine)
- Java 어플리케이션을 클래스 로드를 통해 읽어들여, Java API와 함께 실행하는 역할을 한다
- 실제 자바 프로그램의 실행 주체가 된다
- JVM은 물리적 머신과 별개의 가상 머신으로 자바를 동작시키기 때문에 어떤 하드웨어서도 동일하게 동작이 가능하다
- JVM의 특징
- 스택 기반의 가상 머신 : 대표적인 컴퓨터 아키텍처인 인텔 x86이나 ARM 아키텍처 같은 하드웨어들은 레지스터 기반으로 동작하는 반면, JVM은 스택 기반으로 동작한다
- 심볼릭 레퍼런스 : 기본 자료형(primitive data type)을 제외한 모든 타입(클래스와 인터페이스)을 명시적인 메모리 주소 기반의 레퍼런스가 아니라 심볼릭 레퍼런스를 통해 참조한다
- 가비지 컬렉션(garbage collection): 클래스 인스턴스는 사용자 코드에 의해 명시적으로 생성되고 가비지 컬렉션에 의해 자동으로 파괴된다
- 기본 자료형을 명확하게 정의하여 플랫폼 독립성 보장: C/C++ 등의 전통적인 언어는 플랫폼에 따라 int 형의 크기가 변하는 반면, JVM은 기본 자료형을 명확하게 정의하여 호환성을 유지하고 플랫폼 독립성을 보장한다
- 네트워크 바이트 오더(network byte order): 자바 클래스 파일은 네트워크 바이트 오더를 사용한다. 인텔 x86 아키텍처가 사용하는 리틀 엔디안이나, RISC 계열 아키텍처가 주로 사용하는 빅 엔디안 사이에서 플랫폼 독립성을 유지하려면 고정된 바이트 오더를 유지해야 하므로 네트워크 전송 시에 사용하는 바이트 오더인 네트워크 바이트 오더를 사용한다. 네트워크 바이트 오더는 빅 엔디안이다.
Java 컴파일 과정
- 자바로 소스코드를 작성한다 -> .java 파일
- Build 작업을 통해 java 파일은 자바 컴파일러의 javac라는 명령어를 통해 .class 파일을 생성하는데, 이는 컴퓨터가 읽을 수 없고 JVM은 읽을 수 있는 자바 바이트 코드이다
- 이렇게 생성된 바이트 코드가 클래스 로더에 의해 JVM 안에 로드되고, 실행 엔진에 의해 기계어로 해석되어 메모리 상(Runtime Data Area)에 배치된다
https://yummy0102.tistory.com/510
자세한 컴파일 과정은 위 포스팅을 참고하세요😋
Java 코드 실행 과정
- 제일 먼저 main() 함수를 찾아서 있으면 클래스 로더가 실행을 시킨다.
- Static 영역에 import한 패키지들과 프로그램의 모든 클래스, 필드, 메서드 올라간다
- stack 영역에 main()의 stack frame이 위치한다. -> 지역변수는 초기화시 위치, 클래스 선언을 제외한 메서드의 {}undefined if의 {}이 생길 때마다 Stack Frame이 생성
- 메서드가 실행된다
- } 괄호를 만나면 Stack Frame이 사라지게 된다
- jre가 jvm을 종료시키고 위치했던 메모리들이 모두 없어진다
- 스택 프레임간에 는 데이터 접근이 불가능하지만, 내부의 스택 프레임은 외부의 스택프레임에 접근이 가능하다
참고)
https://minzoovv.dev/java/java-terminology/
728x90
'야미스터디 > Java' 카테고리의 다른 글
[Java] Checked Exception vs Unchecked Exception 📌 (1) | 2022.10.14 |
---|---|
[Java] Java 버전 별 차이점📌 (0) | 2022.09.06 |
[Java] Java 컴파일 과정 📌 (0) | 2022.09.04 |
[Java] 스네이크, 카멜, 파스칼 케이스 📌 (0) | 2022.09.03 |
[Java] 인터페이스와 추상클래스 📌 (0) | 2022.08.18 |
댓글