'자파 커피'처럼 어디서든 즐길 수 있는 언어

Java의 로고는 왜 커피 모양인지 한번쯤 생각해 본적이 있다. 그건 개발자들이 언제나 어디서든 즐겨 먹은 '자바 커피'처럼 어디서든 자바 프로그램을 실행할 수 있음을 알리기 위함이었을 것이다.
자바가 개발되기 전 존재한 여러 프로그래밍 언어 중 A, B, C의 기능 A:입/출력, 문맥 B:기계식 데이터 타입, 연산기능, 메서드 C:자료형 데이터 타입, 자료구조 에 공통 실행환경 (JVM), 클래스/객체 기능을 추가한 것이 바로 자바언어다.
자바의 특징은 매우 매우 다양하다.
. class에는 반드시 하나의 자바 클래스만 들어있다. 즉, 단일. java(자바소스파일)에 여러 개의 클래스를 작성할 경우, 컴파일 시 클래스마다 별도의 클래스 파일이 생성된다. . jar로 압축하여 배포하거나 실행이 가능하다. 자바는 실행까지 여러 과정을 거친다.
자바 실행 과정을 구분하면 크게 2개로 구분된다.
1. Compile-time 환경
2. Run-time 환경
사용자 작성. java->Java Compiler->Java Byte Code. class
####. java
우리가 메모장이던 IDE 던 워드던 텍스트입력이 가능한 프로그램을 통해 자바의 문법을 이용해서 코드 작성을 하면 자바소스파일. java이 된다.
컴파일러는 프로그래밍 언어로 작성된 소스 코드를 컴퓨터가 이해하고 실행할 수 있는 기계어 또는 바이트코드로 변환하는 프로그램이다.
자바 컴파일러는 자바 소스 파일을 자바 바이트코드인 . class로 변환하는 프로그램이 되겠다.
####. class
자바 바이트 코드는 JVM이 해석할 수 있는 중간 언어이며 컴파일된 소스 파일이다.
바이트 코드 자체로는 기계어가 아니기 때문에 HW가 해석할 수 없다.
Class Loader->Java Interpreter/JIT Compiler->Runtime 시스템->OS->HWClass Loader
Class Loader는
. class을 동적으로 로드하는 역할을 한다.
클래스 로더는 프로그램 실행 시 필요한 클래스를 메모리로 로드하고, 이를 초기화하는 과정을 관리한다.
자바 인터프리터는 자바 가상 머신(JVM)의 일부로, 바이트코드를 한 줄씩 읽고 실행한다.
JIT(Just-In-Time) 컴파일러는 자바 인터프리터의 단점을 보완하기 위해 도입된 기술이다.
자바 프로그램이 실행되는 동안 필요한 바이트코드를 기계어(Machine Code)로 동적으로 컴파일한다.
Java Interpreter와 Jit Compiler는 결합되어 사용되며 초기에는 인터프리터를 사용하여 빠르게 실행을 시작하고, 실행 중에 JIT 컴파일러가 핫스폿을 찾아 최적화된 기계어로 변환한다.
Runtime 시스템은 자바 프로그램이 실행되는 동안 필요한 다양한 기능을 제공하는 환경이다. 런타임 시스템은 자바 프로그램이 올바르게 실행되고, 성능이 최적화되며, 시스템 자원이 효율적으로 사용될 수 있도록 지원한다.
이렇게 자바 인터프리터와 JIT 컴파일러 + Runtime을 모두 포함하는 개념이 JVM이다.
즉, JDK > JRE > JVM, Java Class Library이며 JDK안에는 추가로 Java 개발 도구가 포함되어 있다

클래스와 메소드에 대한 정보를 저장하는 공유 메모리.
클래스의 구조, Static 변수, 메소드의 코드, 상수 풀, 필드 및 메소드의 메타데이터(구조와 동작..)를 저장한다.
JVM의 모든 스레드가 접근 할 수 있고, 클래스 로딩 시 클래스 정보를 저장한다.
모든 객체와 배열을 저장하는 동적 메모리 할당 공간.
모든 스레드가 접근할 수 있으며, Garbage Collector가 여기서 수행된다. 객체 생성시 메모리가 이곳에서 할당되는 것.
객체와 더불어서 기본 데이터 타입을 객체로 감싼 Wrapper 클래스(Integer, Double, Boolean...)도 Heap에 저장된다. 자세히 말하면 Wrapper 클래스의 객체(값이라고 생각하면 된다.)는 힙에 저장되고, 이 객체를 가리키는 Reference(참조, 객체가 저장된 힙 메모리의 주소를 가리킴)가 스택에 저장된다.
스레드마다 제공되는 영역
메소드 호출마다 새로운 Stack Frame이 생성되고, 이 영역에서는 메소드 호출 과 관련된 지역 변수, 운영 스택, 메소드 호출의 상태 정보가 저장된다.
우리가 사용하는 기본 데이터 타입 (int, char, boolean...)이 Stack에 저장된다. 기본 데이터 타입은 값 자체만 저장하므로, 스택 프레임의 지역 변수, 메소드의 매개변수로 사용되어 스택에 직접 저장된다.
메소드 종료시 해당 Stack Frame은 자동으로 제거된다.
현재 실행 중인 JVM 명령의 주소를 저장
각 스레드마다 본인의 PC Register를 갖고, 실행 중인 메소드의 명령을 추적할때 사용한다.
현재 실행 중인 명령어의 주소를 보관하므로, 메소드가 호출될 때나 반환될 때 PC Register 값은 업데이트 된다.
자바 이외의 언어로 작성된 메소드 호출 관련.
자바 이외의 언어로 작성된 코드인 네이티브 코드와 상호작용 하기위한 메모리 공간이다.