JAVA 특징
- 객체 지향 언어
- 자동 메모리 관리 → GC
- 멀티 쓰레드 지원
- 풍부한 라이브러리
- 운영체제의 독립적
JVM (운영체제의 독립적)
자바 프로그램이 실행되는 가상 컴퓨터
자바는 여러 보통 운영 체제 별로 JVM이 구현이 되어있고, JVM만 있으면 운영체제 관련 없이 실행 가능
스택 기반으로 동작
C언어 같은경우 왜 OS의 종속적일 수 밖에 없었나?
프로그램이 실행 되기 위해서는 windows나 linux같은 운영체제가 제어하고 있는 시스템의 리소스의 일부인 메모리(RAM)를 제어할 수 있어야 하는데, java이전의 c같은 대부분의 언어로 만들어진 프로그램은 이러한 이유때문에 OS에 종속되어 실행되게 되어 있었다.
JVM (메모리 구조)
- Garbage Collector
- Garbage Collector(GC)는 힙 메모리 영역에 생성된 객체들 중에서 참조되지 않은 객체들을 탐색 후 제거하는 역할. 이때, GC가 역할을 하는 시간은 언제인지 정확히 알 수 없음
- Execution Engine
- 클래스 로더를 통해 JVM 내의 Runtime Data Area에 배치된 바이트 코드들을 명령어 단위로 읽어서 실행합니다.
- 처음에는 인터프리터 방식이여서 속도가 느렸는데 JIT컴파일러방식을 통해 보완 → But 바이트 코드를 어셈블러 같은 네이티브 코드로 바꿈으로써 실행이 빠르지만 역시 변환하는데 비용이 발생 → JVM은 모든 코드를 JIT 컴파일러 방식으로 실행하지 않고, 인터프리터 방식을 사용하다가 일정한 기준이 넘어가면 JIT 컴파일러 방식으로 실행
- Class Loader
- JVM내로 클래스 파일을 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈, 런타임 시에 동적으로 클래스 로드
- Runtime Data Area
- JVM의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역. 쉽게 말해 프로그램을 수행하기 위해 OS에서 할당 받은 메모리 공간 이다. 이 영역은 크게 Method Area, Heap Area, Stack Area, PC Register, Native Method Stack로 나눌 수 있습니다.
Runtime Data Area
- Method Area
- 모든 쓰레드가 공유하는 메모리 영역. 메소드 영역은 클래스, 인터페이스, 메소드, 필드, Static 변수 등의 바이트 코드를 보관.
- Heap Area
- 모든 쓰레드가 공유하며, new 키워드로 생성된 객체와 배열이 생성되는 영역. 또한, 메소드 영역에 로드된 클래스만 생성이 가능하고 Garbage Collector가 참조되지 않는 메모리를 확인하고 제거하는 영역.