JVM(Java Virtual Machine)
: 자바 가상 머신으로 자바 바이트 코드를 실행할 수 있는 주체이다.
- Java Source: 사용자가 작성한 Java 코드
- Java Compiler: Java Source 파일을 JVM이 해석할 수 있는 Java Byte Code로 변경
- Class file: Java Compiler에 의해 변환된 Byte Code (.class 파일)
- Class Loader: JVM 내로 Byte Code를 로딩해 클래스들을 Runtime Data Area에 배치
- Execution Engine: 로딩된 클래스의 Byte Code를 해석(Interpret)
- Garbage Collector: Heap 메모리 영역에 적재된 객체 중 참조되지 않은 객체들을 탐색하고 제거
- Runtime Data Area: JVM이 프로그램을 수행하기 위해 운영체제에서 할당받은 메모리 영역
.java
파일이 생성된다..java
파일을 컴파일하여 .class (바이트코드)
파일을 생성한다..class
)들을 엮어서 Runtime Data Area
(JVM이 OS로부터 할당받은 메모리 영역)으로 적재하는 역할을 한다. (자바 애플리케이션이 실행 중일 경우에만 이런 작업이 수행된다.)class loader
에 의해 메모리영역에 적재된 클래스파일
들을 기계어
로 변경하여 명령어 단위로 실행하는 역할을 한다.Execution Engine
의 두가지 방식
- Interpreter 방식
- 명령어를 하나하나 실행하는 방식이다.
- Just-In-Time 컴파일러 방식
- Just-In-Time 컴파일러에 의해 적절한 시간에 전체 바이트 코드를 네이티브 코드로 컴파일한다.
Execution Engine
이 네이티브로 컴파일된 코드를 실행하는 방식이다. (성능을 높이는 방식)
Runtime Data Area
영역은 크게 5가지로 나뉜다.Method Area
, Heap Area
Stack Area
, PC Register
, Native Method Stack
- Method 영역: 클래스, 변수, Method, static 변수, 상수 정보 등이 저장되는 영역(모든 Thread가 공유)
- Heap 영역: new 명령어로 생성된 인스턴스와 객체가 저장되는 영역(모든 Thread가 공유)
- Stack 영역: Method 내에 사용되는 값이 저장되는 영역, 메소드가 호출될 때 적재되고, 실행이 완료되면 LIFO로 삭제(각 Thread별로 생성)
- PC Register: 현재 수행중인 JVM 명령의 주소값 저장(각 Thread별로 생성)
- Native Method Stack: 다른 언어(C/C++ 등)의 메소드 호출을 위해 할당되는 영역, 언어에 맞게 Stack이 생성됨
new
키워드로 생성된 객체와 배열이 생성되는 영역이다.Method Area
에 로드된 클래스만 생성이 가능하고Garbage Collector(GC)
가 참조되지 않은 메모리를 확인하고 제거하는 영역이다.
int a = 10;
- 정수값이 할당 될 수 있도록 메모리공간을
a
라고 잡아두고, 그 메모리 영역에 10의 값이 들어간다.- 다시 말하면,
Stack Area
에 a라는 이름의, 값이 10인 메모리 공간을 만든다.Person p = new Person();
- Person p는
Stack Area
에 생성되고,new
로 생성된 Person 크래스의 인스턴스는Heap Area
에 생성된다.
Stack Area
의 p가Heap Area
에 생성된 객체를 가리키고(참조하고)있다.
Stack
이 생성된다.PC Register
를 이용하여 thread를 돌아가면서 수행할 수 있게 한다.Java
외의 언어로 작성된 네이티브 코드를 위한 메모리 영역이다.C/C++
등의 코드를 수행하기 위한 스택이다.Garbage
: 정리되지 않은 메모리, 유효하지 않은 메모리 주소를 의미한다.String[] array = new String[2];
array[0] = '0';
array[1] = '1';
array = new String[] {'G', 'C'};
위 코드에서 String 배열이 할당 되기 전 array[0] = '0';
과 array[1] = '1';
에 해당하는 0과 1은 주소를 잃어버려서 사용할 수 없는 메모리가 된다. 이를 자바에서 Garbage
라고 부른다.
또한 앞으로 사용하지 않고 메모리를 가지고 있는 객체 역시 Garbage
에 포함된다.
GC는 Minor GC
, Major GC
로 나뉜다.
Young
영역(Eden
, Survivor1
, Survivor2
) 에서 일어나는 GC이다.
- 객체가 최초로 생성되는 영역은
Eden
영역이다.Eden
영역에 객체가 가득차면 첫번째 GC가 일어난다.Survivor1
영역에Eden
영역의 메모리를 그대로 복사한다. 그리고Survivor1
영역 이외의 다른 영역의 객체를 제거한다.Eden
영역,Survivor1
영역도 가득차게 되면, 이 두 영역에 생성된 객체들 중에서 참조되고 있는 객체가 있는지 검사한다.Eden
영역,Survivor1
영역에 생성된 객체들 중 참조되고 있는 객체들만Survivor2
영역에 복사한다.Survivor2
영역을 제외한 다른 영역들의 객체를 제거한다.- 위의 과정중에서 일정 횟수 이상 참조되는 객체들을
Survivor2
영역에서Old
영역으로 이동시킨다.
Survivor2
영역이 가득 차기 전에 Old
영역으로 이동시켜 비운다.Old
영역에서 일어나는 GC이다.
Old
영역에 있는 모든 객체들을 검사하며 참조되고 있는지 확인한다.- 참조되지 않은 객체들을 한번에 모아서 제거한다.
Minor GC
보다 시간이 훨씬 많이 걸린다.
실행중에 GC를 제외한 모든 thread가 중지된다.
Old
영역에 있고 참조되지 않은 객체들을 표시하고, 해당 객체들을 모두 제거한다.
Heap
메모리 영역 중간에 빈 메모리 공간이 생기는데, 이를 없애기 위해 메모리를 재구성한다.