자바 (Java) : 객체지향 프로그래밍 언어 (Object-Oriented Programming Language)
- 객체지향 프로그래밍 (
OOP) : 초기부터 객체지향 방법론에 의거해 객체 지향 프로그램 언어로 설계
- 먼저 객체를 만들고, 이들 객체들을 서로 연결하여 하나의 큰 프로그램을 완성
- 플랫폼에 독립적 : 동일한 프로그램을 여러 운영체제에서 실행 가능
- 어떤 운영체제인지 상괸없이 동일한
.java 파일을 컴파일하면, 동일한 .class 파일이 생성
WORA : Write Once, Run Anywhere
- 메모리를 자동으로 정리 : 가비지 콜렉터 등을 활용해
RAM을 자동으로 관리
- 풍부한 래퍼런스 : 오픈 소스 라이브러리를 기반으로 한 자바 생태계가 장기간 구축되어왔음
Java SE : Java의 표준 문법 (Standard Edition)
Java가 어떤 문법적인 구성을 가졌는지, 와 같은 것들을 정의
Oracle에서 Java 공식 로드맵을 통해 자바의 미래 버전 적용 상황을 볼 수 있음
JDK (Java Development Kit) : Java SE의 구현체
Java 프로그램을 개발하고 실행하기 위해 JRE 및 여러 개발 도구들을 제공
자바 런타임 환경 (Java Runtime Environment) : Java를 위한 서비스를 제공하는 소프트웨어 계층
JRE는 컴퓨터 운영체제 위에서 존재하며, JVM 및 라이브러리로 구성
- 자바 코드를 필요한 라이브러리와 결합한 뒤에
JVM을 시작하는 온디스크 시스템
자바 가상 머신 (Java Virtual Machine) : 서로 다른 플랫폼에 동일한 Java 실행 환경 제공
- 플랫폼에 종속적 : 자바에서 소스 파일을 통해 생성된 바이트 코드를
CPU에 맞게 바이너리 코드로 해석한 후 실행
- 소스 코드 (
source code) : Java 언어로 작성된 소스 파일 (*.java)
- 바이트 코드 (
byte code) : 소스 코드를 JVM이 이해할 수 있는 언어로 변환한 파일 (*.class)
- 바이너리 코드 (
binary code) : 컴퓨터가 이해할 수 있는 1bit 크기의 0과 1로 이루어진 이진 코드
클래스 로더 (Class Loader) : JVM 내로 .class 파일을 로드하고 이를 실행 엔진에 배치
- 메소드 영역에 저장되는 데이터 :
FQCN / 클래스, 인터페이스, enum / 메소드와 변수
-
로딩 (Loading) : JVM이 시작할 때, 3개의 클래스 로더가 순서대로 동작
BootStrap ClassLoader : JDK 클래스 파일 (코어 자바 API) 로딩
Platform ClassLoader : JAVA_HOME/lib/ext 또는 java.ext.dirs에 위치한 클래스 파일 로딩
System ClassLoader : classPath나 modulePath에 위치한 클래스 파일 로딩
- 마지막까지 클래스를 찾지 못하면
ClassFoundException
-
링크 (Linking) : 로드된 .class 파일을 검사하고 이를 메소드 영역에 넣음
- 검증 (
Verify) : .class 파일 형식이 유효한지 검사
- 준비 (
Preparation) : 클래스 변수 (static)와 기본값에 필요한 메모리를 준비
- 교체 (
Resolve) : 심볼릭 메모리 래퍼런스를 메소드 영역에 있는 실제 래퍼런스로 교체
-
초기화 (Initialization) : static 변수 또는 static 블록 내부의 값을 기본값으로 할당
자바 실행 엔진 (Execution Engine) : 클래스 로더에 의해 배치된 클래스의 바이트 코드를 실행
- 자바 인터프리터 (
Java Interpreter) : JVM에서 바이트 코드를 한줄씩 명령어 단위로 읽어 번역
JIT 컴파일러 : 인터프리터 방식으로 실행하다가, 적절한 시점에 바이트 코드 전체를 바이너리 코드로 번역해 실행
- 가비지 콜렉터 (
Garbage Collector) : 더 이상 사용되지 않는 인스턴스를 찾아 메모리에서 삭제해 메모리를 관리
런타임 데이터 에리어 (Runtime Data Area) : 운영체제에서 프로그램 수행을 위해 할당한 메모리 공간
PC 레지스터 (PC Register) : 쓰레드 (Thread)가 시작될 때 생성되는 공간
- 쓰레드가 현재 실행할 스택 프레임을 가리키는 포인터 생성
JVM stack : 프로그램 실행 과정에서 임시로 할당할 데이터를 저장 (메소드 호출 시 마다 각각의 스택 프레임 생성)
Native method stack : 바이트 코드가 아닌 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행
- 힙 (
Heap) : 모든 쓰레드가 공유하는 객체 저장
new로 생성된 객체와 배열 혹은 String 관련 자원이 저장 / GC에 의해 관리
Permanent Generation : 생성된 객체들의 정보의 주소값 저장
- 리플렉션 (
Reflection) 으로 동적으로 클래스가 로드될 때 사용
- 클래스 로더에 의해 로드된 클래스, 메소드 등에 대한 메타 정보가 저장 :
JVM에 의해 사용
New/Young : 생명 주기가 짧은 객체를 GC의 대상으로 하는 영역 (Minor GC 발생)
Eden : 객체들이 처음 생성되는 공간 (첫번째 GC가 발생)
Survivor 0, 1 : Eden에서 참조되는 객체들이 저장 (Major GC 발생 : Minor GC에 비해 느림)
Old : 생명 주기가 긴 객체를 GC의 대상으로 하는 영역
New/Young에서 일정 시간 참조되고 있는 객체들이 저장
- 메소드 영역 (
Method Area) : 클래스를 메모리에 처음 올릴 때 초기화하는 클래스 이름, static 메소드나 변수 저장
Runtime Constant Pool : 상수 자료형을 저장해 참조 (중복 방지)
자바 네이티브 인터페이스 (Java Native Interface) : 자바 네이티브 코드로 작성된 함수 사용 방법 제공
- 자바 네이티브 코드 (
Java Native Code) : 다른 언어로 작성된 라이브러리를 JVM 내에서 호출하는 코드
- 네이티브 메소드 라이브러리 (
Native Method Library) : 네이티브 실행 프로그램을 만들 때 사용되는 라이브러리