3 분 소요

자바 (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 크기의 01로 이루어진 이진 코드

클래스 로더 (Class Loader) : JVM 내로 .class 파일을 로드하고 이를 실행 엔진에 배치

  • 메소드 영역에 저장되는 데이터 : FQCN / 클래스, 인터페이스, enum / 메소드와 변수
  1. 로딩 (Loading) : JVM이 시작할 때, 3개의 클래스 로더가 순서대로 동작

    • BootStrap ClassLoader : JDK 클래스 파일 (코어 자바 API) 로딩
    • Platform ClassLoader : JAVA_HOME/lib/ext 또는 java.ext.dirs에 위치한 클래스 파일 로딩
    • System ClassLoader : classPathmodulePath에 위치한 클래스 파일 로딩
    • 마지막까지 클래스를 찾지 못하면 ClassFoundException
  2. 링크 (Linking) : 로드된 .class 파일을 검사하고 이를 메소드 영역에 넣음

    • 검증 (Verify) : .class 파일 형식이 유효한지 검사
    • 준비 (Preparation) : 클래스 변수 (static)와 기본값에 필요한 메모리를 준비
    • 교체 (Resolve) : 심볼릭 메모리 래퍼런스를 메소드 영역에 있는 실제 래퍼런스로 교체
  3. 초기화 (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) : 네이티브 실행 프로그램을 만들 때 사용되는 라이브러리

태그:

업데이트: