2022. 7. 16. 00:30ㆍJava
오늘은 JVM의 구조에 대해서 적어보려 한다.
이전에 간략하게나마 JVM 구조에 대해 적은 것이 있으니 참고하는 것도 좋을거 같다.
오늘은 이런 원론적인 얘기를 하려는 것은 아니고 실제로 JVM이 어떻게 구성되어 있는지를 알아보려고한다.
윗 글을 읽기 귀찮은 분들 위해 간략하게 JVM이 무엇인지에 대해 설명하면
운영체제 위에서 동작하는 자바를 위한 운영체제라고 생각하면 편할거 같다.
일반적으로 계층이 Program - OS - HW 이렇게 구성된다면
JVM은 Program - JVM - OS - HW 이렇게 구성된다.
그럼 JVM은 어떻게 생겼을까? 그 구조에 대해 알아보자.
🧐JVM Structure
이것이 JVM이다.
여기서 가장 중요한 것은 Runtime Data Area다.
Runtime Data Area는 다음과 같은 것들로 이루어져 있다.
- Method Area
- Heap
- Stack
- PC Register
- Native Method Stack
Method Area는 클래스별 전역변수, 정적변수, 메서드 정보가 저장 된다.
Heap에는 런타임 중에 생성되는 객체를 동적 할당 되는 곳이다.
Stack에는 지역변수, 파라미터 변수, 리턴 정보 등이 저장되는 곳이다.
PC Register에는 현재 JVM이 수행중인 명령어가 저장된다.
Native method Stack은 자바 외의 언어로 작성되어 있는 함수, 코드가 저장되어 있다.
여기서 중요한 것이 하나 있다.
자바는 다중 스레드, 즉 멀티스레딩을 이용한다.
멀티 스레딩을 이용하기 때문에 각각의 스레드마다 공유하는 것이 있다.
운영체제의 일반적인 메모리 구조에서 공유하는 것이 있다.
운영체제는 일반적으로 코드영역, 데이터 영역, 힙 영역을 공유한다.
하지만 JVM은 좀 다르다.
JVM은 Method Area와 Heap을 공유하고, 나머지는 각각의 스레드에 할당된다.
이것은 자바에서 중요한 의미를 가진다.
바로 GC(Garbage Collector)때문이다.
GC는 Heap을 정리한다.
GC의 구조는 버전별로 달랐지만, 현재는 자바 8버전 이후부터는 G1GC를 사용한다.
GC에 대해서는 다음에 또 적으면 좋을거 같다.
Github
'Java' 카테고리의 다른 글
(Java 8) 자바 8에 추가된 함수형 인터페이스(Function, Predicate 등) (2) | 2022.11.20 |
---|---|
(Java) Interface와 Abstract class의 차이(인터페이스와 추상클래스) (0) | 2022.07.16 |
(Java) StringBuilder 문자열 만들기 (0) | 2022.03.12 |
(Java) 문자열 잘라 배열에 저장 (0) | 2022.03.12 |
logging이란? (0) | 2022.02.23 |