자바 언어의 특징
- 운영체제에 독립적이다
- 운영체제나 하드웨어가 아닌 JVM하고만 통신
- 자동 메모리 관리 (가비지 컬렉터)
- 네트워크 분산처리 지원
- 멀티쓰레드 지원
- 동적 로딩 지원
JVM
- Java compiler 가 .java 파일을 .class 라는 Java bytecode로 변환
- Java compiler => JDK를 설치하면 bin 에 존재하는 javac.exe
- 바이트 코드는 다시 실시간 번역기 또는 JIT 컴파일러에 의해 바이너리 코드로 변환
- JIT 컴파일(just-in-time compliation) : 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일러
- 실제 바이트 코드를 실행하는 시점에서 자바 가상 머신(JVM, 정확히는 JRE)이 바이트 코드를 JIT 컴파일을 통해 기계어로 변환
- 구성요소{
클래스 로더(Class Loader)
실행 엔진(Execution Engine)
인터프리터(Interpreter)
JIT 컴파일러(Just-in-Time)
가비지 콜렉터(Garbage collector)
런타임 데이터 영역 (Runtime Data Area)
}- 클래스 로더 => JVM 내로 클래스 파일(*.class)을 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈
- 실행엔진 => 자바 바이트 코드(*.class)는 기계가 바로 수행할 수 있는 언어보다는 비교적 인간이 보기 편한 형태로 기술된 것 / 클래스를 실행시키는 역할
- 인터프리터 => 실행 엔진은 자바 바이트 코드를 명령어 단위로 읽어서 실행하지만 한 줄씩 수행하기 때문에 느리다는 단점이 있음
- JIT(Just-In-Time) => 인터프리터 방식으로 실행하다가 적절한 시점에 바이트 코드 전체를 컴파일하여 기계어로 변경하고, 이후에는 해당 더 이상 인터프리팅 하지 않고 기계어로 직접 실행하는 방식
- 가비지 콜렉터 => 더이상 사용되지 않는 인스턴스를 찾아 메모리에서 삭제
- Runtime Data Area => 프로그램을 수행하기 위해 OS에서 할당받은 메모리 공간
- PC Register => Thread가 시작될 때 생성되며 생성될 때마다 생성되는 공간으로, 스레드마다 하나씩 존재 / 재 수행 중인 JVM 명령의 주소를 갖음
- JVM 스택 영역 => 데이터를 저장하기 위한 영역
- Native method stack => 자바 프로그램이 컴파일되어 생성되는 바이트 코드가 아닌 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역
- Method Area (= Class Area = Static area) => 클래스 정보를 처음 메모리 공간에 올릴 때 초기화되는 대상을 저장하기 위한 메모리 공간
- Runtime Constant Pool => 스태틱 영역에 존재하는 별도의 관리영역
- Heap 영역 => 객체를 저장하는 가상메모리 공간. new 연산자로 생성되는 객체와 배열을 저장
JDK
- Java Development Kit (자바 개발 키트)
- Java 를 사용하기 위해 필요한 모든 기능을 갖춘 Java용 SDK (Software Development Kit)
- JDK 는 JRE를 포함
JRE
- Java Runtime Environment (자바 런타임 환경)
- JVM + 자바 클래스 라이브러리(Java Class Library) 등으로 구성
가비지 컬렉션
- 개발자가 메모리가 언제 해제되는지 정확하게 알 수 없다.
- 가비지 컬렉션이 동작하는 동안에는 다른 동작을 멈추기 떄문에 오버헤드가 발생한다.
- Mark And Sweep 알고리즘
- Mark 과정 : 먼저 Root로부터 그래프 순회를 통해 연결된 객체들을 찾아내어 각각 어떤 객체를 잠조하고 있는지 찾아서 마킹
- Sweep 과정 : 참조하고 있지 않은 객체 즉 Unreachable 객체들을 Heap에서 제거
- Compact 과정 : Sweep 후에 분산된 객체들을 Heap의 시작 주소로 모아 메모리가 할당된 부분과 그렇지 않은 부분으로 압축 (가비지 컬렉터 종류에 따라 하지 않는 경우도 있음)
- 참고 : https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EA%B0%80%EB%B9%84%EC%A7%80-%EC%BB%AC%EB%A0%89%EC%85%98GC-%EB%8F%99%EC%9E%91-%EC%9B%90%EB%A6%AC-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%F0%9F%92%AF-%EC%B4%9D%EC%A0%95%EB%A6%AC
'프로그래밍 > JAVA' 카테고리의 다른 글
[Java] Enum (0) | 2024.03.30 |
---|---|
[Java] Collections (0) | 2024.03.30 |
[Java] about java (0) | 2024.03.30 |
[Java] Operator / Scope (0) | 2024.03.30 |
[Java] method (0) | 2024.03.30 |