Write Once Use Anywhere
소스파일 하나만 작성하면 어디서든 사용이 가능하다.
JVM을 사용하여 운영체제와 독립적으로 동작할 수 있다. (어느 운영체제나 같은 형태로 실행)
Java는 처음부터 객체 지향 언어로 개발되었다.
자동메모리 관리 등을 지원해 안정성이 높고 역사가 길어 수많은 참고자료가 있다.
하지만 실행을 위해 JVM을 거쳐야 하므로 다른 언어에 비해 실행속도가 느리고
개발자가 일일이 예외 처리를 해줘야 하며 다른 언어에 비해 코드 길이가 길다는 단점이 있다.
: 소스파일 전체를 컴파일 한 후 기계어를 CPU와 메모리를 통해 읽어 바로 실행하는 언어
: 소스파일을 컴파일 하지 않고 Interpreter를 사용해 소스파일을 한줄씩 번역하면서 실행하는 언어
Java는 자바 컴파일러에 의해 바이트코드로 컴파일되지만 JVM에서는 인터프리터로 실행된다.
Compile 언어지만 Interpreter 언어의 특징을 동시에 가진다.
- 개발자가 자바 소스파일(.java)를 작성한다.
- JDK가 제공하는 javac(자바 컴파일러)를 사용하여 소스파일을 컴파일 한다.
- JVM의 Class Loader가 컴파일로 생성된 바이트코드(.class)를 전달받아 동적로딩을 통해 실행에 필요한 클래스들을 로딩하여 JVM내부의 Runtime Data Area에 로드한다.
- JVM의 Execution에 의해 기계어로 해석되어 실행된다.
.class파일은 Loading, Linking, Initializing단계를 거쳐 JVM에서 사용할 수 있게 된다.
프로그램상의 모든 클래스, 변수, 메서드의 정보를 Method Area
에 배치한다.
JVM 내부에 바이트코드를 로드하고 링크를 통해 배치하는 작업을 수행하는 모듈이다.
동적으로 클래스를 로드하고 jar 파일 내부에 저장되어있는 클래스들을 JVM에 로드한다.
동적로딩 : 처음 프로그램이 실행될 때 모든 프로그램의 주소 공간을 메모리에 로딩하는 것이 아니라, 실행 중에 필요한 데이터를 메모리에 로딩하는 방식
Interpreter, JIT compiler, Garbage Collector
Interpreter는 바이트 코드를 한줄씩 읽고 번역하는데 느리다는 단점이 있다.
이를 보완하기 위해 나온 Jit 컴파일러는 Interpreter 방식으로 실행을 하다가 적당한 시점에 바이트 코드 전체를 컴파일하여 캐싱한다. 컴파일된 코드를 저장해두기때문에(캐싱) 이 코드들은 Interpreter를 안거치고 바로 실행이 되어 실행속도가 매우 빨라진다.
Garbage Collector는 사용하지 않는 메모리를 추적해 비워주는 기능을 한다.
JDK : Java Development Kit / 자바 개발 도구
JRE : Java Runtime Environment / 자바 실행 환경
JVM : Java Virtual Machine / 자바 가상 기계
JDK : JRE + Development Tools(javac(컴파일러), java, javadoc등 개발에 필요한 도구)
JRE : JVM + 자바 클래스 라이브러리 + 기타 파일 + 클래스로더 / JVM의 실행 환경을 구현.
프로그램을 실행하기 전에 메인메서드를 포함하고 있는지 확인하고 있으면 JVM을 부팅
JVM : 자바 소스코드로 부터 만들어지는 자바 바이너리파일(.class)을 실행한다.
자바 프로그램이 실행되는 가상의 컴퓨터.
JVM만 설치되어 있으면, 자바 바이트 코드는 어떤 운영체제에서라도 실행될 수 있습니다.
단, JVM은 운영체제에 종속적이므로 각 운영체제에 맞는 JVM을 설치해야 한다.
: 부팅이 된 JVM이 전달받은 코드를 실행시킬 때 가장 먼저 하는 일.
: 컴퓨터에서 메모리 같은 역할을 수행하는 영역. 프로그램을 실행하여 발생하는 데이터를 저장.
스레드가 시작될 때마다 생성됨. 스레드마다 하나씩 존재
스레드가 어떤 명령에 의해 실행되어야 할지에 대한 기록을 한다.
현재 수행하고 있는 JVM의 명령 주소를 갖고있다.
바이트코드가 아니라 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행하는 영역
자바 이외의 언어(C,C++,어셈블리 등)로 작성된 코드를 실행할 때 여기에 할당되며 일반적인 C스택을 사용
Java Native Interface를 통해 바이트코드로 전환하여 저장
일반 프로그램처럼 커널이 스택을 잡아 독자적으로 프로그램을 실행시키는 영역
클래스 정보를 처음 메모리공간에 올릴 때 초기화 되는 대상을 저장하기 위한 공간
클래스의 타입, 변수 및 메서드의 정보를 가지고 있으며 모든 쓰레드가 공유한다.
런타임상수풀(Runtime Constant pool) : 상수 자료형을 저장하여 참조하고 중복을 막는다.
프로그램 실행과정에서 임시로 할당 되었다가 메서드를 빠져나가면 바로 소멸이 되는 특성의 데이터들을 저장하기 위한 영역.
실행되는 메서드 및 {}블럭(if문 등)에 대한 데이터가 저장.
가장 처음 실행되는 main()메서드가 첫번째로 메모리에 올라가고 그 다음 실행되는 메서드들이 위에 쌓이는 구조다.
쌓이는 메서드의 단위를 스택 프레임
이라 부른다. 스택 프레임 내부에 스택 프레임이 생길 수있다.
가장 큰 특징은 멀티스레드 환경에서 각 스레드가 고유의 스택영역을 가진다
는 점이다.