JVM이란 ?
- 자바 가상머신으로 자바 바이트 코드를 실행할 수 있는 주체
자바 코드를 컴파일해서 얻은 바이트 코드를 해당 운영체제가 이해할 수 있는 기계어로 바꿔 실행시켜주는 역할
- Class Loader, Execution Engine,Garbage Collector, Runtime Data Area
1. Class Loader
- 자바에서 소스를 작성하면 .java파일이 생성된다.
.java 소스를 자바컴파일러가 컴파일하면 .class파일이 생성된다
이렇게 생성된 클래스파일들을 엮어서 JVM이 운영체제로부터 할당받은 Runtime Data Area로 적재하는 역할
자바 애플리케이션이 실행중일때 수행된다.
2. Execution Engine
- Class Loader에 의해 메모리에 적재된 클래스들을 기계어로 변경해 명령어 단위로 실행하는 역할
인터프리터 방식과 컴파일러를 이용하는 방식이 있다.
3. Garbage Collector
- Heap 메모리 영역에 생성된 객체들 중에 참조되지 않은 객체들을 탐색 후 제거하는 역할
GC가 역할을 수행하는시간이 언제인지 정확하게 알 수 없다.
GC가 수행되는 동안 GC를 수행하는 쓰레드를 제외한 모든 쓰레드가 일시정지된다.
4. Runtime Data Area
- JVM의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역
Method Area, Heap Area, Stack Area, PC Register, Native Method Stack
- Method Area : 필드정보와 메소드정보, Type정보(interface인지 class인지),Constant Pool,static 변수, final class변수 등이 생성되는 영역
- Heap Area : new 키워드로 생성된 객체와 배열이 생성되는 영역, 메소드 영역에 로드된 클래스만 생성이 가능하며 GC가 참조되지 않는 메모리를 확인하고 제거하는 영역
- Stack Area : 지역변수,파라미터,리턴값,연산에 사용되는 임시값들이 생성되는 영역이다.
- PC Register : 스레드가 생성될때마다 생성되는 영역으로 현재 쓰레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역. 이것을 이용해서 쓰레드를 돌아가면서 수행할 수 있게한다.
- Native Method Area : 자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역 (보통 C/C++등의 코드를 수행하기 위한 스택)
- 스레드가 생성되었을때 Method, Heap Area는 모든 쓰레드가 공유
- Stack,PC Register, Native Method Area는 각각의 쓰레드마다 생성되고 공유하지않음.
Garbage Collector
크게 2개로 물리적 공간을 나누었다.
Young Generation 영역
- 새롭게 생성한 객체의 대부분이 여기에 위치. 대부분의 객체가 금방 접근 불가능 상태가 되기때문에 많은 객체가 Yong 영역에 생성되었다가 사라진다.
이 영역에서 객체가 사라질때 Minor GC가 발생한다고 말한다.
- Eden 영역과 Survivor 영역 2개로 나뉜다.
1. 새로 생성한 대부분의 객체는 Eden영역에 위치.
2. Eden영역에서 GC가 한번 발생한 후 살아남은 객체는 Survivor영역중 하나로 이동
3. Eden영역에서 GC가 발생하면 이미 살아남은 객체가 존재하는 Survivor영역으로 객체가 계속 쌓인다
4. 하나의 Survivor영역이 가득차게 되면 그중에서 살아남은 객체를 다른 Survivor영역으로 이동.
그리고 가득찬 Survivor영역은 아무 데이터도 없는 상태가 된다.
5. 이 과정을 반복하다 살아남은 객체는 Old영역으로 이동
중요!!
Survivor영역중 하나는 반드시 비어있는 상태로 남아 있어야한다.
두 Survivor영역에 모두 데이터가 존재하거나 두 영역 모두 0이라면 시스템이 정상적인 상황이 아니라고 의심할 수 있다.
Old Generation 영역
- 접근 불가능상태로 되지 않아 Young Generation 영역에서 살아남은 객체가 Old Generation 영역으로 이동한다.
대부분의 Young 영역보다 크게 할당하며 크기가 큰만큼 GC는 적게 발생한다.
이 영역에서 객체가 사라질때 Major GC 혹은 Full GC가 발생한다고 말한다.
기본적으로 데이터가 가득차면 GC 실행 (Serial GC는 사용하면 안되는 방식)
아래의 글들을 참고하여 작성하였습니다.
https://jeong-pro.tistory.com/148
https://d2.naver.com/helloworld/1329
'컴퓨터공학 기초 > 기초개념+TIP' 카테고리의 다른 글
[기초개념] 객체지향 5대원칙 (0) | 2020.02.22 |
---|---|
[기초개념] stateful vs stateless (0) | 2020.02.19 |
[Git] Git 자주쓰는 명령어 정리/ Git Command (0) | 2020.01.27 |
AWS 배포순서 (0) | 2019.12.23 |
[01] intellij gradle project 생성하기 (0) | 2019.12.17 |
댓글