자바의 플랫폼 독립성
자바의 가장 큰 특징은 플랫폼 독립성이다.
플랫폼 독립성이란 하나의 프로그램이 모든 플랫폼(윈도우, 맥 리눅스..)에서 실행 가능한 것을 말한다.
자바의 가상머신 JVM이 이를 가능하게 해준다.
자바의 실행 파일(.class)은 이 가상머신이 사용하는 기계어의 집합으로 구성되어 있어, 가상머신을 이용하면 어떤 플랫폼에서도 .class파일을 실행할 수 있다.
JVM 이란?
JVM은 JavaVirtual Machine의 줄임말로 wirte once, run erveywhere.
즉 OS마다 따로 코드를 작성해야 하는 번거로움 없이 Java가 플랫폼에 독립적일 수 있게 만들어준다.
그리고 가비지 컬렉션을 통해 자동적인 메모리 관리를 해준다.
(가비지 컬렉션: JVM의 메모리 관리 기법 중 하나로 시스템에서 동적으로 할당됐던 메모리 영역 중에서 필요없어진 메모리 영역을 회수하여 메모리를 관리해주는 기법)
간단히 말해 JVM은 Java 클래스 파일을 로드하고 바이트 코드를 해석하며, 메모리 등의 자원을 할당하고 관리하며 정보를 처리하는 작업을 하는 프로그램이다.
Java Compiler
자바 소스 파일을 JVM이 해석할 수 있는 자바 바이트 코드(.class)로 변경한다.
Class Loader
JVM내로 .class 파일들을 로드한다. 로딩된 클래스들은 Runtime Data Area에 배치된다.
Execution Engine
로딩된 클래스의 바이트 코드를 해석한다. 이 과정에서 ByteCode가 BinaryCode로 변경된다.
Runtime Data Area
JVM 이 프로세스로써 수행되기 위해 OS로부터 할당받는 메모리 영역이다. 데이터 타입에 따라 할당된다.
- 메서드 영역(Method Area)
- 클래스 정보, 전역 변수 정보, Method정보, static 변수 정보, 상수 정보 등이 저장되는 영역.
- 모든 Thread에게 공유된다.
- 프로그램의 시작부터 종료까지 메모리에 남아있다.
- 힙 영역 (Heap Area)
- new 키워드로 생성된 객체(인스턴스), 배열등이 저장되는 구역.
- 모든 Thread에게 공유된다.
- 공간이 부족해지면 Garbage Collection이 실행된다.
- 스택 영역(Stack Area)
- Method안에서 사용되는 값들(매개변수, 지역변수, 리턴 값 등)이 저장되는 구역.
- 각 스레드마다 하나씩 생성된다.
- 메서드가 호출될 때 LIFO로 하나씩 생성되고, 메서드 실행이 완료되면 LIFO로 하나씩 지워진다.
- PC Register
- 각 스레드마다 하나씩 생성된다.
- 스레드가 어느 명령어를 처리하고 있는지 그 주소를 등록한다.
- JVM이 실행하고 있는 현재 위치를 저장하는 역할
- Native Method Stack
- 다른 언어(C/C++ 등)의 메서드 호출을 위해 할당되는 구역.
- 각 스레드마다 하나씩 생성된다.
- 언어에 맞게 Stack이 형성되는 구역이다. JNI(Java Native Interface)라는 표준 규약을 제공한다.
스레드별: JVM Stack, Native Method Stack, PC Register
스레드 공통: Heap, Method Area
자바의 실행과정 : 컴파일러가 자바 소스를 바이트 코드로 변환하고, class loader가 바이트 코드를 런타임 데이터 영역에 로드시킨다. 로딩된 바이트 코드가 실행 엔진에 의해서 실행된다.
자바 개발 도구와 자바 실행 환경
JDK(Java Development Kit): 자바를 이용해 프로그램을 개발하는 데 필요한 도구를 모아둔 집합
JRE(Java Runtime Environment): 완성된 프로그램을 실행하는데 필요한 환경
JDK내부에 JRE가 포함되어 있고, JRE 내부에는 가상 머신이 포함되어 있다.
자바 소스코드의 실행 과정
1. 소스 파일(.java)을 작성한다.
소스 코드의 저장만으로 컴파일이 자동으로 수행된다.
2. 자바 가상 머신상에서 돌아가는 바이트 코드(.class)가 생성된다.
소스 파일과 바이트 코드는 각각 프로젝트 내의 src 폴더와 bin 폴더 안에 위치한다.
바이트 코드는 JVM이 이해할 수 있는 언어로 변환된 자바 소스 코드를 의미한다. 클래스당 하나씩 생성된다.
3. 바이트 코드를 실행하면 자바 가상머신은 운영체제에서 메모리를 할당받아 자바 프로그램을 실행한다.
메모리 할당 이후 실행 파일인 바이트 코드는 메모리의 메서드 영역에 로딩되며, 클래스 내 main() 메서드가 실행된다.
참고
Doit 자바 책
'BACK > JAVA' 카테고리의 다른 글
[JAVA] replaceAll 정규식 사용하기 (0) | 2022.12.19 |
---|---|
객체지향 프로그래밍의 특징 (0) | 2022.11.13 |
[JAVA] 디자인 패턴 정리 (0) | 2022.11.11 |
[JAVA] char단위 입출력- Reader/Writer (0) | 2022.10.23 |
[JAVA] byte단위 입출력- InputStream/OutputStream (0) | 2022.10.23 |