[JAVA] JVM 자바 가상 머신

이경환·2022년 11월 4일
0

JAVA

목록 보기
2/6
post-thumbnail

JVM 이란

자바를 쓰면서 자바 코드는 플랫폼에 영향받지 않는다는 말을 많이 들어 봤다.
이 말은 자바 코드를 컴파일하여, .class 바이트 코드로 만들면
이 코드가 자바 가상 머신 환경에서 실행될 때 JVM에 포함되어있는 JRE(자바 실행 환경)가 현재 사용하는 컴퓨터의 운영체제에 맞게 설치되어 있다면 문제없이 작동한다.

hello world를 출력할 때 cmd창에 javac 명령어를 통해 컴파일한 후 .class파일이 만들어지는 그런 과정이라 할 수 있겠다.

  • jvm은 os에 의존적 이지만, java는 os로부터 독립적이다.

Java는 컴파일 된 .class 파일이 생성 후 생성된 바이트 코드는 각자의 플랫폼에 설치되어 있는 JVM이 운영체제에 맞는 실행 파일로 바꿔줍니다. 즉 JVM을 사용하기 때문에 각자의 플랫폼에 맞게끔 컴파일을 따로따로 해줘야 할 필요가 없다. 하나의 바이트코드로 JVM이 설치되어 있는 모든 플랫폼에서 동작이 가능하다.

JVM 구조

1. Class Loader

컴파일 된 class 파일들을 JVM 이 운영체제로부터 할당받은 메모리영역인 Runtime Data Area로 적재하는 역할을 Class Loader가 한다.

2. Execution Engine

Class Loader에 의해 메모리에 적재된 바이트 코드들을 기계어로 변경해 명령어 단위로 실행하는 역할을 한다.

명령어를 하나 하나 실행하는 인터프리터 와 JIT 컴파일러를 이용하는 방식이 있다.

3. Garbage Collector

Heap 메모리 영역에 생성 된 객체들 중에 참조되지 않는 객체들을 탐색 후 제거하는 역할을 한다.
GC가 역할을 하는 시간은 정확히 언제인지를 알 수 없다.

4. Runtime Data Area

JVM의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역이다.

Runtime Data Area

1. 메소드 영역

클래스 멤버 변수의 이름, 데이터 타입, 접근 제어자 정보같은 필드 정보와 메소드의 이름, 리턴 타입, 파라미터, 접근 제어자 정보같은 메소드 정보, Type정보(Interface인지 class인지), Constant Pool(상수 풀 : 문자 상수, 타입, 필드, 객체 참조가 저장됨), static 변수, final class 변수등이 생성되는 영역이다.

2. 힙 영역

new 키워드로 생성된 객체와 배열이 생성되는 영역이다.

메소드 영역에 로드된 클래스만 생성이 가능하고 Garbage Collector가 참조되지 않는 메모리를 확인하고 제거하는 영역이다.

3. 스택 영역

지역 변수, 파라미터, 리턴 값, 연산에 사용되는 임시 값등이 생성되는 영역이다.

Test p = new Test(); 

라는 코드가 있다면 Test t 참조변수는 스택 영역에 생성되고 new로 생성된 Test 클래스의 인스턴스는 힙 영역에 생성된다.

그리고 스택영역에 생성된 ㅅ의 값으로 힙 영역의 주소값을 가지고 있다. 즉, 스택 영역에 생성된 t가 힙 영역에 생성된 객체를 가리키고(참조하고) 있는 것이다.

메소드를 호출할 때마다 개별적으로 스택이 생성된다.

4.PC 레지스터

Thread 가 생성될 때마다 생성되는 영역으로 Program Counter 즉, 현재 쓰레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역이다.

이것을 이용해서 쓰레드를 돌아가면서 수행할 수 있게 한다.

5. Native method stack

자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역이다.

profile
안녕하세요

0개의 댓글