Write Once, Run Anywhere!
자바 이전에 C/C++과 같은 언어는 컴파일을 리눅스에서 했다면 리눅스에서만 실행이 가능했다.
즉 컴파일러가 OS에 종속되어 해당 OS에 맞는 컴파일러를 각각 사용해야 했던 것이다.
자바는 OS에 관련없이 JRE만 설치되어 있다면 어떤 OS에서도 자바를 컴파일하고 실행이 가능하다.
이를 보완하기 위해 나온 JVM은 가상환경에서 컴파일을 하는 방식으로 모든 OS에서 하나의 JVM으로 실행 및 컴파일 할 수 있게 하였다.

JAVA 컴파일과정 및 메모리 구조

Java 컴파일 과정
.java 파일 생성 후 Build -> compile(javac) -> byteCode .class file(반기계어)
이렇게 생성된 자바 바이트 코드는 클래스 로더에 의해 JVM내로 로드 되고 실행엔진에 의해 해석되어 메모리상에 배치된다.
Execution Engine
execution engine은 두가지 방식으로 바이트코드를 해석하여 실행을 한다.
1 .Interpreter는 자바 바이트 코드를 한줄 씩 실행하여 속도가 느린 단점이 있었다.
2. JIT(Just In Time) Compiler : Interpreter의 단점을 보완하여 자주 반복되는 코드를 기계어로 변환해서 캐싱을 한다.
캐시 사용으로 한번 컴파일 하면 다음에는 빠르게 수행됨.
메모리 구조
- Stack Area : 클래스 내의 메소드에서 사용되는 정보들이 저장되는 공간. 매개변수, 지역변수, 리턴값 등이 저장되며 LIFO 방식으로 실행시 저장되었다 실행이 완료되면 해제된다.
- Heap Area : New 명령어를 통해 생성한 인스턴드와 배열 등의 참조형 변수 정보가 저장되는 공간. Method Area에 올라온 클래스들만 생성이 가능. GC의 대상이 되어 메모리가 해제된다.
- Method Area : 컴파일 시 클래스와 메소드, 멤버(클래스, 인스턴스)변수와 Static 정보 등이 저장되는 공간이다. 모든 쓰레드가 공유한다.
- Runtime Constant Pool : Method Area에 포함되어 있으며 해당 공간에 저장된 데이터의 레퍼런스 값을 저장한다.
- PC Register Area : 쓰레드마다 하나씩 생성되며, JVM 명령의 주소값이 저장되는 공간이다.
- Native Method Stack Area : JVM은 c/c++언어도 지원한다. 자바에서 c/c++의 메소드를 호출할때 사용하는 Stack 영역이라 생각.
'Language & Framework > Java' 카테고리의 다른 글
[JAVA] :: 자바 기초 1 :: 객체 / 클래스 / 인스턴스 / 속성 / 함수 / 메소드 (2) | 2021.07.04 |
---|---|
[JAVA] 소켓(socket) 프로그래밍 (0) | 2021.01.20 |
[JAVA]입출력 IO & NIO (0) | 2021.01.20 |
[JAVA] Garbage Collection (가비지컬렉션)이란? (0) | 2021.01.18 |
[JAVA] JDK, JRE, JVM이란? (0) | 2021.01.18 |