반응형
JVM (Java Virtual Machine)
- 자바 가상 머신으로 자바 바이트 코드(.class 파일)를 OS에 특화된 코드로 변환(인터프리터와 JIT 컴파일러)하여 실행
- 바이트 코드를 실행하는 표준(JVM 자체는 표준)이자 구현체(특정 밴더가 구현한 JVM)
- 특정 플랫폼에 종속적
JRE (Java Runtime Environment): JVM + 라이브러리
- 자바 애플리케이션을 실행할 수 있도록 구성된 배포판
- JVM과 핵심 라이브러리 및 자바 런타임 환경에서 사용하는 프로퍼티 세팅이나 리소스 파일을 가지고 있음
- 개발 관련 도구(JDK)는 포함하지 않음
JDK (Java Development Kit): JRE + 개발 툴
- JRE + 개발에 필요할 툴
- 소스 코드를 작성할 때 사용하는 자바 언어는 플랫폼에 독립적
- 오라클은 자바 11부터는 JDK만 제공하며 JRE를 따로 제공하지 않음
- Write Once Run Anywhere
Java
- 프로그래밍 언어
- JDK에 들어있는 자바 컴파일러(javac)를 사용하여 바이트코드(.class 파일)로 컴파일
- 자바 유료화? 오라클에서 만든 Oracle JDK 11 버전부터/ 상용으로 사용할 때 유료이며 나머지는 무료
JVM 구조
Class Loader
- .class에 있는 바이트코드를 읽고 메모리에 저장
- loading: 클래스 읽어오는 과정
- linking: 레퍼런스를 연결하는 과정
- initialization: static 값들 초기화 및 변수에 할당
메모리
- 메소드 영역에는 클래스 수준의 정보(클래스 이름, 부모 클래스 이름, 메소드, 변수) 저장
- 힙 영역에는 객체를 저장
- 스택 영역에는 스레드 마다 런타임 스택을 만들고, 그 안에 메소드 호출을 스택 프레임이라 부르는 블록으로 쌓음. 스레드 종료하면 런타임 스택도 삭제됨
- PC(Program Counter) 레지스터: 스레드 마다 스레드 내 현재 실행할 instruction의 위치를 가리키는 포인터가 생성됨
- 네이티브 메소드 스택: Native Method를 호출하는 코드를 수행하기 위한 스택
Execution engine
- interpreter: 바이트 코드를 한 줄씩 실행
- JIT compiler: 인터프리터 효율을 높이기 위해, 인터프리터가 반복되는 코드를 발견하면 JIT 컴파일러는 반복되는 코드를 모두 네이티브 코드로 바꿈. 그다음부터 인터프리터는 네이티브 코드로 컴파일된 코드를 바로 사용할 수 있도록 지원
- GC(Garbage Collector): 더이상 참조되지 않는 객체를 모아서 주기적으로 정리하는 프로그램
JNI(Java Native Interface)
- 자바 애플리케이션에서 C, C++, 어셈블리로 작성된 함수를 사용할 수 있게 함
- native 키워드를 사용한 메소드 호출
Native Method Library
- C, C++로 작성된 라이브러리
garbage?
- 주소를 잃어버려서 사용할 수 없는 메모리, 정리되지 않은 메모리, dangling object
garbage collection(GC)?
- garbage의 메모리 해제; JVM이 한가할 때(idle) 혹은 메모리가 부족해져 OS에게 추가로 메모리를 할당해달라고 요청할 때 실행
JVM의 Heap영역의 대전제
- 대부분의 객체는 대부분 일회성이며 금방 접근 불가능한 상태(Unreachable)가 된다.
- 오래된 객체에서 새로운 객체로의 참조는 아주 적게 존재한다.
- 생존 기간에 따라 heap을 두 가지 영역으로 쪼갬(Young, Old 영역) - 초기에는 Perm 영역이 존재하였지만 Java8부터 제거됨
minor gc?
- 새롭게 생성된 객체가 할당(Allocation)되는 Young 영역에 대한 가비지 컬렉션(Garbage Collection)
- 대부분의 객체가 금방 Unreachable 상태가 되기 때문에, 많은 객체가 Young영역에 생성되었다가 사라짐
- The Young Generation is further divided into three spaces: Eden space and two Survivor spaces (S0 and S1).
- eden 영역이 꽉 찬 경우 발생, 빠름
- eden 영역에서 사용되지 않아진 객체의 메모리 해제
- eden 영역에서 살아남은 객체는 s1/s2로 이동(s1이 꽉차면 s2, vice versa)
major gc/full gc?
- minor gc속에서 살아남은 객체가 복사되는 Old 영역에 대한 가비지 컬렉션(Garbage Collection)
- 복사되는 과정에서 대부분 Young 영역보다 크게 할당되며, 크기가 큰 만큼 가비지는 적게 발생함
- old 영역이 꽉 찬 경우 발생, 느림
구체적으로 어떻게?
- Stop the world(STW): GC를 실행하기 위해 JVM이 어플리케이션의 실행을 멈추는 작업
- GC를 실행하는 스레드를 제외한 모든 스레드의 작업이 중단되고, GC가 완료되면 작업 재개됨
- GC옵션이나 알고리즘으로 STW시간을 단축할 수 있음
- Mark and Sweep:
- Mark: 사용되는 메모리와 사용되지 않는 메모리를 식별하는 작업
- Sweep: Mark 단계에서 사용되지 않음으로 식별된 메모리를 해제하는 작업
- Stop The World를 통해 모든 작업을 중단시키면, GC는 스택의 모든 변수 또는 Reachable 객체를 스캔하면서 각각이 어떤 객체를 참고하고 있는지를 탐색하며 mark and sweep 작업을 진행함
algorithm
java11 default gc
-XX:+UseG1GC
힙을 격자/작은 지역으로 쪼개서 특정 지역별로 gc가 일어남.
그래서 예측가능하고 정지시간이 짧음,
성능이 좋고 메모리 효율이 좋음,
gc처리가 병렬처리 가능
튜닝 가능
java8 default gc
-XX:+UseParallelGC
G1GC가 자바7부터 나왔기 때문에 사용 가능 다만 기본값은 아니라는 점
주로 사용되는 GC
- G1 garbage collector(G1GC)
- java 7+ 사용가능
- Z garbage collector(ZGC)
- java 11+ 사용가능
- Parallel garbage collector
- java 5+ 사용가능
728x90
반응형
'개발 > java' 카테고리의 다른 글
[jmh] benchmark test (0) | 2022.08.04 |
---|---|
[powermock] mock static method (0) | 2022.07.21 |
[keyword] transient in serialization (0) | 2022.02.16 |
[junit5] no test found / checked exception is invalid (0) | 2022.02.07 |
[junit] test runner (0) | 2022.01.03 |