티스토리 뷰

JAVA

[JAVA]JVM구조 이해하기

코헴 2019. 1. 15. 23:14

[JAVA] JVM 구조 이해하기

JVM이란?

JVM이란 추상적인 컴퓨팅 머신으로써 3가지 중요 개념이 있다.

  • 명세(스펙)

  • 구현

  • 인스턴스

JVM 다이어그램

다이어 그램상으로 위에서 아래로 내려가는 과정을 수행한다. class 파일의 정보를 Class Loader를 사용해 JVM memory 공간으로 옮기고 이것을 Excution Engine으로 실행하는 구조이다.

Class Loader

클래스로더는 클래스파일 포맷(.class)을 준수하는 어떠한 것이랃도 인지하고 적재할 수 있도록 구현된다. 그리고 런타임시에 클래스를 적재하고 바른 바이트코드로 작성되었는지 검사한다.

일반적으로 클래스로더는 두 종류로 나뉘는데 하나는 boostrap class loader 다른 하나는 user define class loader 이다.

모든 JVM 구현은 반드시 bootstrap class loader가 있어야한다.

JVM Memory(Runtime Data areas)

JVM Memory는 Runtime Data areas로도 불린다. 해당 공간에는 Method area, Heap, JVM Language stacks, PC register, Native method stacks 등으로 구성되어 있다. 이 공간은 클래스 로더에 의해 데이터가 적재되는 공간이다.

Method area

메소드지역으로써, Type (class, interface) 데이터들, 인스턴스 생성을 위한 필요정보(필드, 메소드, 생성자)들을 적재한 공간이다.

또한 각 Type 데이터에는 Runtime Constant Pool을 가지는데, 이곳은 심볼테이블과 유사한 구조로 되어있다. 상수 풀에는 해당 Type의 메소드, 필드, 문자열, 상수등의 레퍼런스를 가지고 있다. 실제 물리적 메모리 위치를 참조할때 사용한다. 그리고 바이트 코드를 메모리에 전부 올리기엔 크기 때문에 바이트코드를 참조할 레퍼런스만 상수풀에 저장하고 추후 해당 값을 참조해서 실행할 바이트코드를 찾아 메모리에 적재하는 경우도 있다. 또한 상수풀을 사용함으로써 동적로딩이 가능하다.

Heap

힙은 객체들이 적재되는 공간이다. 메소드 지역에서 참조한 값을 바탕으로 새로운 객체를 생성하면 이곳에 적재된다.

JVM Language Stacks

PC registers, native method stacks 등이 해당영역을 참조한다.

메소드프레임들이 스택에 하나씩 쌓이게 되는데, 여기서 메소드프레임들은 간단히 메소드라고 생각해도 된다. 스택 자료구조 형식이기 때문에 스택의 맨위에서부터 차례대로 메소드를 실행한다. 또한 하나의 힙을 모든 스레드가 공유하고 있으며, 각 스레드들은 자신만의 고유 JVM 스택을 갖고있는 형태다.

PC Registers

PC Program Counter 의 축약어로써 해당영역은 현재 실행하고 있는 부분의 주소(adress)를 가지고 있다. 일반적으로 PC의 값은 현재 명령이 끝난 뒤에 값을 증가시킨다. 그리고 해당하는 값의 명령을 실행하게 된다. 즉 실행될 명령의 주소를 가지고있다.

Native method stacks

JVM은 네이티브 방식을 지원하기때문에, 타언어의 메소드들을 동작시킬때는 네이티브 스택에 쌓이게 된다. 일반적인 메소드를 실행하는 경우에 JVM 스택에 쌓이다가 해당 메소드 내부에 네이티브 방식을 사용하는 메소드가 존재할경우 해당 메소드는 네이티브 스태에 쌓이게 된다.

Execution Engine

클래스로더에 의해 JVM 메모리 공간에 적재된 바이트코드를 Execution engine을 이용해 실행한다. 바이트 코드를 그대로 사용하는것이 아니라, 기계어로 변경한뒤 사용하게 된다. 그리고 바이트코드를 기계어로 변경할 때엔 두 종류의 방식을 사용한다. 각각 Interpreter, JIT(Just-In-Time) Compiler 이다.

Interpreter는 바이트코드를 실행하며, 하나의 명령어를 바로바로 해석해서 실행한다.

JIT의 경우 인터프리터의 단점(성능, 속도)을 보완하기 위해 도입된 것으로, 실행 엔진이 인터프리터를 이용해 명령어를 하나씩 실행하지만, JIT 컴파일러는 적당한 시간에 전체 바이트 코드를 네이티브 코드로 변경하여 이후에는 실행엔진이 인터프리터대신 네이티브로 컴파일된 코드를 실행하게된다.

  • JIT 컴파일러와 Java 컴파일러는 비교해야한다

Native Method Interface(JNI)

Native Method Interface는 JVM에 의해 실행되는 코드 중 네이티브로 실행하는 것이 있다면 해당 네이티브 코드를 호출하거나 호출될수 있도록 만든 일종의 프레임워크이다.

Native Method Libraries

네이티브 메소드 실행에 필요한 라이브러리들을 뜻한다.

출처 : https://jdm.kr/blog/188

'JAVA' 카테고리의 다른 글

[JAVA] 변수의 초기화  (0) 2019.05.22
[JAVA] 생성자  (0) 2019.05.22
[JAVA] 변수와 메소드  (0) 2019.05.22
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함