Next-Squad/Interview-Question

[자바] 2. JVM 구조 & JAVA 동작 원리

kyupid opened this issue · 1 comments

JVM 구조 & JAVA 동작 원리

틀린부분 피드백 주시면 감사하겠습니다🙏

컴파일러(javac)가 자바 파일(.java)을 컴파일하면 자바 바이트코드(.class)를 생성합니다

클래스 로더는 자바 바이트코드를 JVM내 메모리영역에 올립니다

그 메모리 영역을 Runtime Data Areas 라고 합니다

Runtime Data Areas는 자바바이트코드를 실행하기 위한 메모리 영역입니다.

Runtime Data Areas는 스레드가 공유하는 기준으로 두가지로 나눌수 있습니다

스레드가 공유하는 자원은 Method Area와 Heap이고 나머지 Stack, PC Registers, Native Method Stacks는 스레드들이 개별적으로 사용하는 공간입입니다

Method Area는 클래스의 정보들이 저장됩니다. 클래스의 변수, 정적 변수, 메소드 등의 정보들을 저장합니다

Heap에는 객체들을 저장합니다

Stack에는 프리미티브타입 값들과 Heap에 저장된 객체의 참조값들이 저장이됩니다

PC Registers에는, 각 스레드는 항상 메소드들을 실행하고 있는데요, 각 스레드들이 몇번째줄을 실행하고 있는지의 정보를 담고 있습니다.

이렇게 메모리에 적재된 클래스파일은 실행엔진에 의해서 실행이 됩니다

JVM의 실행엔진은 인터프리터 방식을 사용하는데요, 인터프리터 방식이란 코드 한줄을 읽고 실행하고 그 다음줄을 읽고 실행하고의 방식을 말합니다.

이같은 방식의 문제점은 "바이트 코드"를 실행하는 것이기 때문에 기계어로 번역하는 과정도 포함이 되어있습니다.

때문에, 인터프리터 방식은 느릴 수 밖에 없습니다.

그레서 실행엔진에는 JIT 컴파일러가 있습니다.

JIT 컴파일은 반복되는 바이트 코드들의 묶음을 컴파일 해주어 실행 시간을 더 빠르게 도와줍니다

이런 식으로 런타임에서 인터프리터와 JIT 컴파일러가 동시에 동작하면서 자바 앱이 작동합니다.

실행엔진에 한가지 더 존재하는 것은 GC(가비지 컬렉터)입니다. 자바는 C와 C++과 달리 JVM에서 자동으로 사용하지 않는 객체들을 제거해주는데 그 역할을 GC가 합니다.