(JAVA)JVM 메모리 구조

Mjey·2022년 4월 21일
0

JAVA

목록 보기
2/5
post-thumbnail

🔎 JVM이란?

JVM은 'Java virtual machine'을 줄인 말로 '자바를 실행하기 위한 가상 머신' 즉 '가상 컴퓨터'라고 할 수 있다.
'가상 컴퓨터'는 실제 하드웨어가 아닌 소프트웨어로 구현된 컴퓨터라는 뜻으로 컴퓨터 속의 컴퓨터라고 할 수 있다.
자바로 작성된 애플리케이션은 이 가상 컴퓨터(JVM)에서만 실행되기 때문에, 자바 애플리케이션이 실행되기 위해서는 반드시 JVM이 필요하다.


위의 그림에서 처럼 C언어 같은 경우 OS만 거치고 하드웨어로 바로 전달되는 것에 반해 JAVA는 JVM을 한번 더 거치는 것을 볼 수 있다.
그리고 하드웨어에 맞게 완전히 컴파일된 상태가 아니고 실행 시 해석(interpret)되기 때문에 속도가 느리다는 단점을 가지고 있다.
그러나 요즘엔 바이트코드(컴파일된 자바코드)를 하드웨어의 기계어로 바로 변환해주는 JIT컴파일러와 향상된 최적화 기술이 적용되어서 속도의 격차를 많이 줄였다.

두 번째 위의 그림은 자바가 OS에 독립적인 특징을 갖고 있다는 것을 보여주는 그림이다.

일반 애플리케이션은 OS와 바로 맞닿아 있기 때문에 OS에서 실행시키기 위해서는 애플리케이션을 그 OS에 맞게 변경해야한다. 즉 OS 종속적이라는 단점을 가지고 있다.

하지만 자바의 경우 애플리케이션과 OS의 중간 단계에서 소통하는 JVM이 있기 때문에 다른 OS에서도 현재 OS맞는 JVM을 다운로드 한다면 프로그램의 변경없이 실행이 가능하다. 즉 OS에 독립적인 장점을 가지고 있다.

요약하면 JVM이란 '가상 머신'으로 내부적인 복잡한 구조로 자바애플리케이션을 실행하는 주체라고 할 수 있다.

📌JVM 메모리 구조

자바에서의 전체적인 실행과정은 아래의 이미지와 같다.

이제부터 JVM의 구체적인 실행과정을 알아보자.

우선 소스파일을 작성하고 저장하게되면 Java Compiler에 의해 .java의 소스파일이 JVM이 이해 할 수 있는 바이트코드(Bytecode)로 이루어진 .class파일로 저장된다.

1) Class Loader

바이트코드로 작성된 class파일을 JVM내로 로드하는 역할을 하고, 이렇게 로딩된 class들은 Runtime Data Area배치된다. (이러한 로드과정은 운영체제가 담당한다)


2) Execution Engine

Class Loader에 의해 메모리에 적재된 클래스의 Bytecode들을 BinaryCode 즉 기계어로 변경하고 명령어 단위로 실행한다.
명령어의 실행은 위에서 언급한바와 같이 인터프리터(Interpreter)방식 또는 JIT(Just-In-Time)컴파일러 방식이 있다. JIT 방식의 경우 바이트코드를 기계어로 변환하기 때문에 빠르다는 장점이 있지만 비용이 발생한다는 단점이 있다.
인터프리트 방식은 실행 중 프로그래밍 언어를 읽어가면서 해당 기능에 대응하는 기계어 코드를 실행하기 때문에 느리다는 단점이 있다.


3) Garbage Collector

Garbage Collector(GC)는 Heap 메모리 영역에 생성(적재)된 객체들 중에 참조되지 않는 객체들을 탐색 후 제거하는 역할을 한다.

GC가 역할을 하는 시간은 정확히 언제인지 알 수 없다.


4) Runtime Data Area

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

이 영역은 크게 아래와 같이 나뉜다.

4-1) Method area

  • Class area, Method area, Static area라고 불린다.
  • 프로그램 실행시 필요한 클래스가 인스턴스의 생성과 상관없이 jvm 메모리 상에 로 딩된다. jvm 메모리에 로딩이 되면 메서드 영역에 클래스의 정보들이 올라가게 된 다.
  • Static 영역의 장점은 프로그램 종료시까지 클래스에 대한 정보가 메모리에 상주하
    고 있기 때문에 어디서든 사용가능 하다는 것이다.
    단점은 무분별하게 Static을 남발하면 메모리를 많이 잡아 먹게 된다.
  • 모든 쓰레드가 공유하는 영역이다.
  • 메서드정보 즉 메서드 이름, 리턴타입, 매개변수, 접근제어자 등의 정보 저장
  • 상수풀(Constant pool)
    1) Type에서 사용된 상수를 저장하는 곳
    2) 문자 상수, 타입, 필드, Method reference도 상수 풀에 저장
    3) final class 변수의 경우도 상수 풀에 값 복사
  • Static 변수 저장

4-2) Heap area

  • New연산자를 통해 생성한 객체, 또는 인스턴스와 배열을 저장하는 공간으로 JVM이 관리하는 영역이다.
  • 힙영역에 생성된 객체 및 배열은 스택 영역의 변수나 다른 객체의 필에서 참조한다.
  • 모든 쓰레드에서 공유하는 영역이다.
  • 객체가 더 이상 쓰이지 않거나, 참조가 끊어진 객체의 경우 Garbage Collector에 의해 이 영역에서 제거된다.

4-3) Stack area

  • 메서드가 호출되면 수행에 필요한 만큼의 메모리를 스택에 할당 받는다
  • 할당된 메모리는 이 메서드가 작업을 수행하는 동안 메서드 정보, 지역변수(매개변 수 포함)들과 연산의 중간 결과 등을 저장하는데 사용된다.
  • 기본형 변수는 스택 영역에서 직접 값을 가진다.
  • 참조형 변수는 객체의 힙영역의 객체의 주소값을 가지고 힙영역에 객체를 가리키게 된다.
  • Last In First Out (LIFO) 구조로 호출스택의 제일 위에 있는 메서드가 현재 실 행 중인 메서드이고 아래에 있는 메서드가 바로 위의 메서드를 호출한 메서드이다.

4-4) PC Register

  • Thread(쓰레드)가 생성될 때마다 생성되는 영역으로 Program Counter 즉, 현재 쓰레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역이다.
    (*CPU의 레지스터와 다름)
  • 이것을 이용해서 쓰레드를 돌아가면서 수행할 수 있게 한다.

4-5) Native method stack

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

Conference

JVM 구조와 자바 런타임 메모리 구조
자바의 정석 기초
[Java] JVM 메모리 구조
[18] 자바 메모리 구조

profile
개발일기📒

0개의 댓글