java
[java] JVM이란?
hs_seo
2019. 7. 8. 16:23
JVM
- 자바 가상 머신(Java Virtual Machine)
- 자바 바이트 코드를 실행하는 주체
- Linux, Window, Mac 등 OS에 맞게 구현
- JVM Spec에 맞춰 구현
- Oracle, Eclipse, IBM 등 여러 회사에서 구현
- HotSpot, OpenJ9
- JVM Language
- JVM에서 실행가능한 언어
- Clojure, Groovy, JRuby, Jython, Kotlin, Scala
- Oracle, Eclipse, IBM 등 여러 회사에서 구현
자바 바이트 코드
- 자바 바이트 코드 = 클래스 파일 = .class
- 컴파일러가 .java 파일을 .class 파일로 해석
- 자바 컴파일러, 스칼라 컴파일러, 코틀린 컴파일러 등
- JVM은 자바 바이트 코드를 해석해서 실행
- Write Once, Run Everywhere
- Write Once, Run Everywhere
JVM 주요 모듈
- 클래스 로더(Class Loader)
- 자바 클래스를 메모리에 적재하는 모듈
- 메모리 공간(Runtime Data Areas)
- Stack, Program Counter, Natiie Method Stack는 각 스레드가 독립적으로 관리
- Method Area, Heap은 프로그램 전역으로 관리
- Method Area
- 클래스, 인터페이스의 정보를 가지고 있음
- Heap
- new 로 생성하는 객체의 정보
- Stack
- 로컬 변수 정보
- Program Counter
- 현재 실행위치
- Native Method Stack
- 네이티브 메소드 정보
- 실행 엔진(Execution Engine)
- 컴파일러
- GC 모듈
JVM 힙 메모리 구조
- Young
- new 로 생성되는 신규 객체의 영역.
- Eden, S0, S1 로 구성.
- 마이너 GC의 대상
- Old
- Young에서 살아 남은 객체를 저장하는 영역.
- Full GC의 대상
- Meta
- 클래스 객체의 정보가 보관되는 공간
- JDK8부터 생성. JDK7 버전까지 Permenant Generation영역(PG)이었음.
- PG영역의 메모리 누수 방지, GC 성능 개선을 위하여 메모리 구조를 변경
- PG영역을 Metaspace와 Compressed Class Space영역으로 기능을 분할
실행 엔진
- 컴파일러
- 자바 바이트 코드를 기계어로 번역
- 인터프리터 방식에서 컴파일 방식으로 변환
- JIT 컴파일러
- GC
- 마이너 GC와 풀 GC
- 마이너 GC는 Young 영역의 데이터 정리
- 풀 GC는 Old 영역의 데이터 정리
- JVM을 정지하고 실행하기 때문에 성능에 많은 영향을 끼침
- 가장 좋은 GC 방법이 존재하는 것은 아님
- 작업의 종류에 따라 적절한 GC 방법을 선택하는 것이 필요함
- GC의 종류
- SerialGC
- -XX:+UseSerialGC
- Mark-Sweep-Compact 알고리즘을 이용
- 살아 있는 객체를 선택(Mark)-선택되지 않은 객체를 정리(Sweep)-메모리 공간을 압축(Compact)
- ParallelGC
- -XX:+UseParallelGC
- SerialGC와 동일하지만 여러개의 스레드를 이용하여 동시에 처리
- Parallel Old GC
- -XX:+UseParallelOldGC
- Mark-Summary-Compaction 단계
- Concurrent Mark & Sweep GC
- -XX:+UseConcMarkSweepGC
- Stop-The-World 시간이 짧지만, 다른 GC에 비해 많은 메모리와 CPU를 사용하고, Compaction 단계가 기본적으로 제공되지 않음.
- G1GC(Garbage First) GC
- -XX:_UseG1GC
- 메모리를 N개의 영역으로 나누어서 할당
- SerialGC
- 마이너 GC와 풀 GC
반응형