2020. 4. 15. 22:33ㆍComputer Science/JAVA
JVM (Java Virtual Machine)
1. 정의
º Java로 개발한 프로그램을 컴파일하여 바이트코드를 실행시키기 위한 가상머신.
2. 특징
º JRE(Java Runtime Environment)에 포함
º 자바와 운영체제사이에서 중계자 역할
º 플랫폼 독립적으로, JVM이 실행 가능한 환경이라면 어디서든 Java 프로그램 실행 가능
자바 실행 과정
1. Class Loader
º Java Byte Code(.class) JVM이 운영체제로부터 할당받은 메모리 영역인 Runtime Data Area로 적재하는 역할
º Run 타임시 class를 load
º 자바 애플리케이션이 실행중일 때 작업이 수행
2. Execution Engine
º Class Loader에 의해 메모리에 적재된 Byte Code들을 기계어로 변경해 명령어 단위로 실행
º JIT(Just-In-Time) 컴파일러를 이용하는 방식
- JIT 컴파일러는 적절한 시간에 전체 바이트 코드를 네이티브 코드로 변경해서 Execution Engine이 네이티브로 컴파일된 코드를 실행하는 것으로 성능을 높이는 방식
3. Garbage Collector
º Heap 메모리 영역에 할당되었다가 더 이상 참조되지 않는 객체들을 탐색 후 제거
º GC가 역할을 하는 시간은 정확히 언제인지를 알 수 없다.(참조가 없어지자마자 해제되는 것을 보장하지 않음)
º JRE 최신버전(11~12 이후)의 JVM에는 Heap 크기와 상관없이 일시정지 시간이 10ms 이하인 GC 알고리즘(ZGC, Shenandoah)이 탑재
4. Runtime Data Area
º JVM 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역
º Method Area, Heap Area, Stack Area, PC register, Native Method Stack 영역으로 구분
- [Method Area, Heap Area] 모든 스레드에서 공유, [Stack Area, PC 레지스터, Native Method Stack Area] 각 스레드별로 생성
1) Method Area
º Method, static 변수, Method Byte Code, final class 변수, Constant Pool 등이 생성되는 영역
- Constant Pool(상수 풀) : 문자 상수, 타입, 필드, 객체 참조가 저장
º 프로그램이 실행되면 모든 코드가 저장되어 있는 상태가 아니다.
- new 키워드를 통해 객체가 동적으로 생성되기 이전에는 단순 텍스트
º 객체 생성 후 메소드를 실행하게 되면 해당 클래스 코드에 대한 정보를 Method Area에 저장
2) Runtime Constant Pool
º Class 파일 Constant Pool 테이블에 해당하는 영역
º 클래스와 인터페이스 상수, Method와 필드에 대한 모든 레퍼런스 저장
º JVM은 Runtime Constant Pool 통해 해당 Method의 실제 메모리 상 주소를 찾아 참조
3) Heap
º new 키워드로 생성된 객체, 배열이 생성되는 영역
º Method Area에서 로드된 클래스만 생성이 가능하고 Garbage Collector가 참조되지 않는 메모리를 확인하고 제거
º Heap에 생성된 객체와 배열은 Stack Area의 변수나 다른 객체의 필드에서 참조
4) PC Register
º 현재 수행중인 JVM 명령의 주소값이 저장되는 영역(각 Thread 별로 하나씩 생성)
5) Stack
º 지역 변수, 파라미터, 리턴 값, 연산에 사용되는 임시 값등이 생성되는 영역(각 Thread 별로 하나씩 생성)
6) Native Method Stack Area
º JAVA 외 언어(ex C/C++ 등)로 작성된 Native 코드를 위한 메모리
º C/C++ 등의 코드를 수행하기 위한 스택
º Native 메서드의 매개변수, 지역변수 등을 Byte Code로 저장
Heap Area(Hotspot JVM 기준)
JVM Heap 영역에서는 Young Generation(Eden, Survivor)과 Old Generation으로 나누어져 있다.
1. Eden
º Object가 Heap에 최초로 할당되는 장소
º Eden 영역이 꽉 차게 되면 Object의 참조 여부를 따져 만약 참조가 되어 있는 Live Object 이면 Survivor 영역으로 넘기고, 참조가 끊어진 Garbage Object이면 남겨놓는다.
º 모든 Live Object가 Survivor 영역으로 넘어가면 Eden영역을 모두 청소(Scavenge) 한다.
2. Survivor
º Eden 영역에서 살아남은 Object들이 잠시 머무르는 곳
º Survivor 영역은 두 개로 구성되며 Live Object를 대피시킬때 하나의 Survivor 영역만 사용.
- 이러한 전반의 과정을 Minor GC 라고 한다.
3. Old Generation
º Young Generation에서 Live Object로 오래 살아남아 성숙된 Object는 Old Generation으로 이동
- 성숙된 Object 의미는 애플리케이션에서 특정 회수 이상 참조되어 기준 Age를 초과한 Object
º 비교적 오랫동안 참조가 되어 이용되고 앞으로도 계속 사용될 확률이 높은 Object들을 저장하는 영역
- 이러한 Promotion 과정 중 Old Genertation의 메모리도 충분하지 않으면 해당 영역에도 GC가 발생하는데 이를 가리켜 Full GC(Major GC)라고 한다.
4. Permanet & Metaspace
º 공통점 : Class의 Meta 정보나 Method의 Meta 정보, Static 변수와 상수 정보들이 저장되는 공간으로 흔히 메타데이터 저장 영역이라고도 한다.
º 차이점 :메모리 영역
- Permanet : Heap 영역(JVM에서 관리)
- Metaspace : Native 영역(OS에서 관리)
º Metaspace가 Native 메모리를 이용함으로서 개발자는 영역 확보의 상한을 크게 의식할 필요가 없어지게 되었다.
구분 | 상세 구분 | Permanet | Metaspace |
저장정보 | 클래스의 메타 정보 | 저장 | 저장 |
메소드의 메타 정보 | 저장 | 저장 | |
Static 변수, 상수 | 저장 | Heap 영역으로 이동 | |
관리 포인트 | 메모리 관리(튜닝) |
Heap 영역 튜닝 Perm 영역 별도 튜닝 |
Heap 영역 튜닝 Native 영역 동적 조정 |
GC 측명 | GC 수행 대상 | Full GC | |
메모리 측면 | 메모리 크기(옵션) |
- XX : PermSize - XX : MaxPermSize |
- XX : MetaspaceSize - XX : MaxMetaspaceSize |
Reference
- https://jeong-pro.tistory.com/148
- https://limkydev.tistory.com/51
- https://12bme.tistory.com/382
- https://coding-start.tistory.com/205
- https://www.holaxprogramming.com/2013/07/16/java-jvm-runtime-data-area/
- https://johngrib.github.io/wiki/java8-why-permgen-removed/
'Computer Science > JAVA' 카테고리의 다른 글
[JAVA] SORT 사용 정리 (0) | 2021.07.08 |
---|