-
[Camel][Java] JVM(가상머신)의 메모리 모델Java/개념 정리 2020. 2. 27. 19:23
JVM이란?
JVM은 Java Virtual Machine의 약자 입니다. 이 JVM의 가장 큰 특징은 Java로 작성된 프로그램이 다른 플랫폼에서도 실행 될 수 있게 하는것입니다. JVM의 또다른 특징은 메모리를 관리하고 최적화하는 것입니다. JVM은 프로그램의 실행을 위해서 메모리 관리가 필요하고, 이를 위해 메모리 공간은 나눠서 데이터의 특성에 따라 분류해서 저장합니다. JVM의 메모리 공간은 크게 메소드 영역, 스택 영역, 힙 영역 총 3개의 영역으로 구분됩니다.
JVM의 구조
Class Loader (클래스로더)
JVM 내에 클래스 파일을 Load 하고 배치하는 작업을 수행하는 모듈입니다. Java의 기본적인 클래스로더는 Bootstrap, Extention, Application 클래스로더 3가지가 있습니다. 클래스로더는 Runtime 시점에 클래스를 로딩하게 해주며 인스턴스를 생성하면 클래스 로더를 통해 메모리에 Load할 수 있습니다.
Execution Engine (실행 엔진)
실행엔진은 이전에 클래스로더를 통해 Load된 클래스의 바이트코드를 실행하는 Runtime 모듈입니다. 이 실행엔진은 바이트코드를 명령어 단위로 읽어서 실행합니다. 초창기 JVM은 한줄 씩 읽어 해석하고 실행하는 인터프리터 방식이라서 느리다는 단점이 있었지만, 최근에는 바이트코드를 네이티브코드로 변환하는 JIT 컴파일러방식을 사용해 그 단점을 보완했습니다. 하지만 변환과정에 비용이 발생함에 따라 매번 JIT 방식을 사용하지 않고 일정한 기준을 넘어서면 JIT 방식을 사용합니다.
Runtime Data Areas
런타임 데이터 영역은 JVM이 OS에서 실행되면서 할당받은 메모리 영역입니다. 런타임 데이터 영역을 총 5가지 영역으로 구분할 수 있습니다. PC 레지스터, 스택영역, 네이티브 메소드 스택 영역, 힙 영역, 메서스 영역이 있습니다.
PC Register
PC레지스터는 각 쓰레드마다 하나씩 존재합니다. 그리고 쓰레드가 생성될 때 시작됩니다. PC레지스터의 기능은 쓰레드가 어떤 명령어로 실행되어야 할지에 대한 기록을 하는 부분으로 현재 수행중인 JVM 명령의 주소를 갖습니다.
Native Method Stack Area
Java 프로그램이 컴파일되어 생성되는 바이트코드를 제외한 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역입니다. 즉, Java가 아닌 다른 언어로 작성된 코드를 위한 공간입니다.
메소드 영역
메소드 영역에는 소스파일을 컴파일 할때 생성되고 JVM에 의해 실행가능한 바이트코드가 저장되는 영역입니다. 또한 static으로 선언한 클래스 변수 역시 이 영역에 저장됩니다. 즉, 메소드 영역은 클래스 정보를 처음 메모리 공간에 올리 때 초기화되는 대상을 저장하기 위한 메모리 공간인 것입니다.
스택 영역
스택영역은 지역변수와 매개변수, 쓰레드, 임시 데이터, 메소드의 정보가 저장되는 공간입니다. 이러한 지역변수화 매개변수는 이들을 포함하고 있는 메소드를 벗어나면 소멸하는 특징이 있습니다. 그렇기 때문에 지역변수와 매개변수는 선언되는 순간에 스택에 할당되고 할당된 메소드의 실행이 완료되면 스택에서 소멸하게 되는것입니다.
힙 영역
힙 영역에는 인스턴스가 저장되게됩니다. 인스턴스가 스택이 아니고 힙 영역에 저장되는 이유는 인스턴스의 소멸은 지역변수 및 매개변수의 소멸과는 다르기 때문입니다. 즉, 간단히 말하면 데이터의 성격이 다른 것입니다. 이와 같은 인스턴스의 소멸시기는 JVM이 결정하게 됩니다.
그렇다면 JVM은 언제 인스턴스를 소멸시킬까? JVM은 어떠한 형태로든 참조되지 않는 인스턴스를 소멸시킵니다. 이러한 JVM의 인스턴스 소멸을 우리는 가비지 컬렉션(Garbage Collection) 또는 GC 라고 합니다. 힙영역은 GC의 대상이 되는 메모리 공간입니다.
하지만 GC대상이 되었다고 해서 바로 소멸이 되는 것은 아닙니다. 만약 GC의 대상이 되고 바로 소멸이 일어나게된다면 빈번한 GC로 인해 시스템에 부담을 줄 수 있습니다. 그렇기 때문에 GC가 성능에 영향을 미치지 않게 하기 위해서, 실행 타이밍은 별도의 알고리즘을 기반으로 계산됩니다.
'Java > 개념 정리' 카테고리의 다른 글
[Camel][Java] BigInteger & BigDecimal 클래스 (0) 2020.02.28 [Camel][Java] Wrapper 클래스에 대해서 (0) 2020.02.28 [Camel][Java] 예외처리 (feat. try~catch문) (0) 2020.02.24 [Camel][Java] Inner , Local , Anonymous 클래스란? (0) 2020.02.24 [Camel][Java] Abstract Class (추상클래스)와 Interface(인터페이스) (0) 2020.02.21