Back-end/Java

JVM(Java Virtual Machine)

nauni 2021. 1. 21. 14:40

운영체제(OS)에 독립적인 Java

 

자바 프로그램 실행은 JVM을 사용하여 운영체제에 독립적으로 실행가능하다. JVM이 사용자 프로그램과 OS 사이에서 일종의 번역기능을 담당한다고 생각한다. 따라서 작성하는 코드는 컴파일되어 JVM을 거쳐 각 OS에 맞는 기계어로 번역되는 것이다. 그렇다면 각 OS에 맞게 번역되어야 하는데 어떻게 독립적일까? 그 이유는 자바 코드를 작성하고 실행하기 위해서는 JDK를 설치하는데 JDK가 운영체제 별로 다르기 때문이다. (설치하는 JDK가 운영체제 별로 다르다.)

 

 

 

JVM 메모리 구조

1. 소스코드.java 파일을 작성한다.

2. 흔히 main에서 실행을 하면, 해당 파일을 컴파일하여 .class 파일(바이트코드)을 생성한다.

3. 컴파일 된 .class 파일을 class loader에게 넘겨주면 JVM에서 변환작업을 거쳐 파일이 실행된다.

바이트코드

바이트 코드란 특정 하드웨어가 아닌 가상 컴퓨터에서 돌아가는 실행 프로그램을 위한 이진 표기법이다. 하드웨어가 아닌 소프트웨어가 처리하는 코드이다.

Runtime Data Area

- Method Area : data, code 영역에 해당되는 듯 하다.

- Heap Area : 객체, 배열 정보등이 저장된다.

- Stack Area : 스택에 올라오는 정보의 영역이다.

- PC(Program Counter) register : 각 스레드마다 생성되어 실행정보를 표시한다.

- Native Method Area : 다른 언어로 작성된 코드를 호출하기 위한 곳이다. C, C++ 언어 접근이나 하드웨어 접근 용도로 사용된다.

 

Execution Engine

자바코드가 컴파일 된 파일은 .class 파일로 바이트 코드이다. 따라서 실제로 execute 하기 위해서는 해당 OS에 맞는 형식으로 번역되어야 한다. Execution engine은 코드가 실행(execute)되기 위해서 작동하는 엔진이다.

 

- interpreter : 한줄 한줄씩 읽고 기계어(native code, machine code)로 번역해준다.

- JIT Compiler : 정적 컴파일(실행되기 전 모두 번역) + 인터프리터 를 결합한 방식이다. 번역 내용을 캐싱하여 같은 내용의 번역이 요청되면 캐싱된 내용을 전달해주어 실행속도가 빨라지는 편이다.

- GC(Garbage Collector) : 가비지 콜렉터는 heap영역에서 더 이상 참조되지 않는 객체를 수거해 제거해주는 역할을 한다. Minor GC, Majer(Full) GC 로 나뉜다. GC가 관여하는 영역은 heap 영역이다.

 

Heap area

 

 

생성된 참조객체는 eden 상태에서 참조 상태에 따라 survivor 0, survivor 1으로 옮겨진다. 이때 참조되지 않고 남는 객체들은 GC에 의해서 Minor GC로 청소된다.

 

Old 상태로 넘어온 객체는 해당 메모리가 부족해질 경우 Full GC로 청소된다. Full GC가 실행되는 동안은 GC를 제외한 모든 스레드가 동작하지 않는다.

 

Permanant 영역은 java 8 부터는 수정되어 metaspace로 변경되었다고 한다. 클래스 로더에 의해 로드된 class 들이 존재한다.

Thread(스레드)

Java는 멀티스레드를 지원한다. 스레드는 프로세스 실행의 단위이다. Java 에서 각 스레드는 독립적인 PC, Native Method area, Stack을 가지며 Heap, Method area는 공유한다.