자바는 운영체제에 독립적인이유 그리고 자바로 작성된 프로그램은 운영체제의 종류에 관계없이 실행이 가능하다 이유 ?
- Java Virtual Machine 때문이다. 그렇다면 어떠한 이유? 일까.
![](https://velog.velcdn.com/images/jhva/post/294648dd-c8e5-476f-b235-7e06a8d4c102/image.png)
자바 컴파일 순서
- 개발자가 자바 소스코드를 작성.
- 자바 컴파일러 가 자바 소스파일을 컴파일한다. 이때 나오는 파일은 자바 바이트코드 파일로 아직
컴퓨터가 읽을 수 없는 즉 .자바 가상 머신이 이해할 수 있는 코드이다.
바이트 코드의 각 명령어는 1바이트 크기에 Opcode와 추가 피연산자로 이루어져있다.
- 그 후 컴파일한 자바 바이트코드 를 읽어주는 것이 자바 인터프리터이다.
- 자바는 동적으로 클래스를 읽어오므로, 프로그램이 실행 중인 런타임에서야 모든 코드가 자바 가상머신과 연결된다.
- 이렇게 동적으로 클래스를 읽어오는것이,클래스로더
- JIT 컴파일러 는 프로그램이 실행중인 런타임에 실제 기계어로 변환해주는 컴파일러를 의미.
- 동적 번역이라고도 불리는 이기 법은 프로글맴의 실행 속도를 향상시키기 위해 개발이되었다.
- 가비지 컬렉터 더는 사용하지 않는 메모리를 자동으로 회수한다.
- 따라서 개발자가 따로 메모리를 관리를 하지ㅏ않아도 더욱 손쉽게 프로그램잉을 할수 있게 도와준다.
- 그래서 이걸 보고 생각이든 부분은 JVM의 메모리 또는 구성요소 ,하는 역할이 궁금해짐 .
여기서 컴파일이란 ?
- 컴퓨터는 무조건 0과 1로만 모든 명령을 이해하고 실행한다. 우리가 ‘A’라는 문자를 입력하더라도 컴퓨터는 이것을 0과 1로 이루어진 이진코드로 해석을한다.여기서 ‘A’라는 문자를 어떻게 해석해줄 것인가? 이러한 기능을 컴파일이라고한다.
- 즉 사람이 이해하는 언어를 컴퓨터가 이해할 수 있는 언어로 바꾸어주는 과정이다.
- 원시코드에서 목적코드로 바꾸어주는 것이 컴파일이고, 목적파일을 실행 파일로 바꾸는 것이 링크.
여기서 바이트 코드란 ?
자바 가상 머신이 이해할 수 있는 언어로 변환된 자바 소스 코드
- 자바 컴파일러에 의해 변환되는 코드의 명령어 크기가 1바이트라서 자바 바이트 코드라고 불린다.
- 자바 바이트코드는 자바 가상 머신만 설치되어있으면 어떤 운영체제에서라도 실행될수있다.
- 단, 자바 프로그램과는 달리 자바 가상 머신(JVM)은 운영체제에 종속적이므로, 각 운영체제에 맞는 자바 가상 머신을 설치해야 합니다.
자바의 특징
- 운영체제에 독립적
- 객체지향 언어
- 비교적 배우기 쉬움
- 자동 메모리 관리
- 네트워크와 분산처리를 지원
- 멀티쓰레드를 지원함
- 동적 로딩을 지원함
- 보통 자바로 작성된 애플리케이션은 여러개의 클래스로 구성되어 있다. 자바는 동적 로딩을 지원하기 때문에 실행 시에 모든 클래스가 로딩되지 않고 필요한 시점에 클래스를 로딩하여 사용 할 수 있다는 장점이 있다.
JVM 구성요소 및 동작
![](https://velog.velcdn.com/images/jhva/post/e10de47e-50b5-4535-9848-384e836afa9a/image.png)
- 프로그램이 실행되면 OS로부터 메모리를 먼저할당. (필요로하는 메모리)
- 자바컴파일러를 통해 작성한 .java → .class 로 변환 (바이트코드)
- 변환된 파일을 class Loader 에서 바이트코드 JVM에 로딩
- 로딩 된 바이트코드를 execution engine을 통해 기계어로 해석
- 해석된 바이트코드를 runtime data Area 에 배치되어 실질적인 수행이이루어짐
Class Loader
- 로딩 → 링킹 (래퍼런스연결)→ 초기화 세가지 기능을 동작.
- 클래스로더는 자바 컴파일로를 통해 바이트코드로 변환된 부분을 초기화 시키는역할을함
- Method Area에 적재, 로딩이 끝나면 Heap Area 에 적재
- Linking 은 검증(verify)을 통해 바이트코드 파일이 유효한 지 체크와 클래스 변수(static)의 필요한 메모리, 메모리 래퍼런스를 Method영역에 있는 실제 래퍼런스로 교체함
- Initailization, Static 변수의 값을 할당함.
- 모든 바이트 코드(.class)를 한번에 메모리에 올리는게 아니라 필요할 때마다 동적으로 올려줌
클래스 로더의 계층구조, 3가지 클래스 로더 제공 .![](https://velog.velcdn.com/images/jhva/post/c28dd40c-db54-4d80-b98d-ec556cd29071/image.png)
- Bootstrap Class loader
- JAVA_HOME/lib 에 있는 핵심 자바 API를 제공함. 다른 모든 ClassLoader 인스턴스의 부모역할 .
- Extension Class Loader
- JAVA_HOME/lib/ext 폴더 또는 java.ext.dirs 시스템 변수에 해당하는 위치에 있는 클래스를 읽는다. 부트스트랩 클래스 로더의 자식이고 모든 응용 프로그램에 사용할 수 있도록 표준 핵심 자바 클래스의 확장을 로딩
- System Class Loader
- Application class loader 로도 불린다. application level의 클래스들을 로드함 .
JVM의 메모리 관리
Method Area
- field , method, type constant pool, static ,final,클래스 인터페이스 등 관리
스택
- 메서드 호출 시마다 가각의 스택 프레임(메서드만을 위한공간) 이 생성된다. 그리고 메서드안에 서 사용되는 값들을 저장하고, 호출된 메서드의 매개변수, 지역변수 , 리턴 값 몇 연산시 일어나는 값들을 임시로 저장하고.
마지막으로 메서드 수행이 끝나면 프레임별로 삭제 .
Heap Area
- 모든 객체와 인스턴스 변수, 배열 등 저장
- new 키워드로 생성된 객체와 배열이 생성되는 영역
- statck Area는 지역 변수와 thread가 관리
PC register
- 운영체제에서 관리되는 context switch가 발생할때 사용함
Native Method Stack
- 자바가 아닌 다른 언어로 작성된 코드를 실행함 .
Reference
https://techvidvan.com/tutorials/java-virtual-machine/