JVM(Java Virtual Machine)

yeseoung·2022년 12월 30일
0

Java

목록 보기
1/1
post-thumbnail

자바의 컴파일 과정

자바의 컴파일 방식은 JAVAC(자바 컴파일러) 를 통해 소스파일을 JavaByteCode(중간 코드)로 인코딩한다.
이후 인코딩된 중간코드는 JVM에 의해 입력 자료와 함께 실행한다.

JVM(Java Virtual Machine)

자바 바이트 코드를 실행하는 주체로써 플랫폼을부터 독립적인 자바 바이트코드를
JVM의 정해진 규격에 맞게 실행한다.

ex)윈도우에서 작성된 자바 바이트 코드를 맥에서 실행하려면 맥JVM을 이용하면된다.

바이트 코드란

virtual machine에서 작동하는 실행프로그램을 위한 이진표현법으로써 하드웨어가 아닌
소프트웨어에 의해 처리되기때문에 기계어보다 추상적이다.
(출처/https://catsbi.oopy.io/df0df290-9188-45c1-b056-b8fe032d88ca#d48b297b-3ee6-4f18-b229-544e0d35d584)

이처럼 운영체재에 관계없이 코드를 실행할수있는 JVM은 운영체재에 종속된다는 특징을 가지고있다.

JVM의 구조

JVM<Class_Loader><Execution_Engine>,<JVM_memory>그리고<Garbage_Collector>로 구성되어 있다.

(출처/https://catsbi.oopy.io/df0df290-9188-45c1-b056-b8fe032d88ca#d48b297b-3ee6-4f18-b229-544e0d35d584)

<class_loader>

JVM내에 클래스 파일을 가져오고 링크를 통해 Runtime_Data_Area에 배치하는 역할을 한다.
런타임중에 동적으로 클래스를 불러오는 특징이 있다.

<Execution_Engine>

Class_LoaderRunTime_Data_Area에 배치한 바이트코드를 기계어로 변환한다.
컴파일은 "인터프리터JIT컴파일러"로 이루어지는데 자바 인터프리터가 명령어단위로 실행을 해나가다가
해당 메소드의 반복횟수 기준을 넘으면 JIT 컴파일러를 통해 바이트코드 전체를 네이티브 코드로 번역하여 캐시에 저장한다.
이후 인터프리터는 캐시에 저장된 네이티브 코드를 사용함으로써 빠른 수행이 가능하다.
_
JIT 컴파일러의 컴파일 속도는 바이트 코드를 하나씩 인터프리팅하는것보다 느리기 때문에 한번 수행하는 코드의 경우 인터프리터만을 이용하는것이 효과적이다.

<JVM_Memory>

스택,PC Register,네이티브 메소드 스택,힙,메소드 영역으로 구성된 JVM의 메모리 영역으로 자바 어플리케이션을 실행시 사용되는 데이터를 저장하는 영역이다.


스택:정적으로 할당되는 메모리영역
지역변수,매개변수,리턴값,연산에 사용되는 임시값등을 생성하는 영역이다. 또한 힙영역에 생성된 인스턴스 참조 주소값또한 할당된다.

int a = 10;//지역변수이므로 스택에 할당됨.

이라는 코드가 작성되었다면 스택 영역에 a라는 이름의 값이 10인 메모리 공간을 할당한다.
메소드가 종료됨과 동시에 pop을통해 메모리를 해제한다.


네이티브 메소드 스택:자바 외의 다른 언어로 작성된 네이티브 코드를 위한 메모리 영역으로 보통 c/c++을 수행하기위한 스택


힙: 동적으로 할당되는 메모리영역
객체의 인스턴스 데이터가 할당됨 인스턴스를 가르키는 참조변수는 스택에 할당

String a = new"hi";//String객체는 참조 타입으로 힙에 할당됨. a = stack "hi" = heap

<Garbage_Collector>가 참조되지않는 메모리를 확인,제거하는 영역이다.


메소드 영역:모든 스레드가 공유하며 클래스,인터페이스,필드,메소드 등등 클래스 로더가 읽은 바이트코드들을 보관한다.


Pc Register:쓰레드가 생성될때마다.생성되는 영역으로 현재 쓰레드가 실행되는 부분의 주소와 명령을 저장하는 영역이다.
이것을통해 쓰레드를 돌아가며 수행하게해준다.

<Garbage_Collector>

동적으로 할당된 메모리(힙 영역) 영역중 사용되지않는 영역을 확인하여 해제하는 역할을 함
과정:Mark And Sweep
1.<Garbage_Collector>스택의 모든 변수를 돌며 참조하고있는 객체를 마킹한다.
2.마킹되지않은 객체를 에서 삭제한다.

마무리

JVM은 제임스 고슬링이 설계한 가상머신으로써 앞서 작성한것과 같이 운영체재에 관계없이 자바 코드를 유연하게 실행할수있다는 특징을 가지고있다.또한 JIT 컴파일러를 통해 인터프리터만으로는 부족했던 컴파일 성능을
향상시켯다는 점이 인상적이었다. 더불어 GC(Garbage_collector)를 통해 자동으로 메모리를 관리하는것또한 JVM이 가진 장점이라고 생각한다.


떠오른 궁금증은 String 객체가 new를 통해 힙영역의 문자열상수풀(String constant pool)에 생성될때 동일한 문자열이라도 각 객체가 새로 생성되는데 그렇다면 new연산자를 쓰는것이 손해가 아닌가하는 생각이들었다.


JVM을 공부하며 모르는것을 알수있었다 그리고 내가 알아야할것이 많다는것 또한 많이 알수있었다.
클래스로더의 링크과정은 아무리 봐도 완벽히 이해하기힘들었다. "한참 부족하다"라는 생각이 들게 해주는 배움이었다. 자만은 의지의 적이라는 생각을 다시 한번 상기시킬수있었다.

profile
세세하게 알아가보자

0개의 댓글