<정의>
- [오라클 피셜] Java 응용 프로그램 실행을 지원하는 소프트웨어의 한 측(aspect)
- [Javaworld 피셜] Java 프로그램 실행 방법. JVM 설정에 따라 실행하는 프로그램 resource 관리
- 기술 정의 : 코드를 실행하고, 해당 코드에 대해 런타임 환경을 제공하는 소프트웨어 프로그램 사양(specification)
- 보통 개발자들이 말하는 JVM은 특정 기기에서 실행 중인 process,
특히 Java 앱에 대한 resource를 대표하고 통제하는 SERVER 를 지칭 (면접에서 이거 물어보는 듯?)
<기능>
- Java 프로그램이 어느 기기, 운영 체제에서도 실행 가능하게 함
("한번 작성하면, 어디에서나 실행한다")
- 프로그램 메모리 관리 최적화
: Heap과 Stack의 메모리 사용량을 확인하며, 메모리 설정값 조율
- GC(가비지 컬렉션) process를 통해 메모리 관리. Java 프로그램이 안 쓰는 메모리 제거&청소
- Java 클래스 파일을 이식성있게 실행하는 가상 머신(Virtual Machine)이지만, 가상 운영체제는 없음
(런타임 환경 or 프로세스 가상 머신이 알맞음)
<[Javaworld 피셜] JVM 의 3가지 주요 구성>
1. 사양 (Specification) : User가 소프트웨어 시스템이 어떻게 동작하는지 읽을 수 있는 설계 문서
2. 구현 (Implementation) : 라이센스가 부여된 거의 모든 JVM은 오픈JDK와 JVM fork 로 생성
3. 인스턴스 (Instance) :
- 스펙이 구현되어 release한 걸 다운로드한 프로그램 == 독립된 하나의 JVM instance (같은 버전 쓰면 같은거임)
- Almost 개발자들이 말하는 JVM ? 소프트웨어 개발 환경에서 실행되는 하나의 JVM instance
ex) "야, 네 JVM은 메모리 얼마나 씀?", "스택오버플로우로 내 JVM이 아작났어!!"
<[Youtube 피셜] JVM 의 3가지 주요 구성>
1. 클래스 로더(Class Loader)
- 클래스를 메모리에 로드하고 실행하기 위해 사용 가능케 하는 JVM 일부
- [개발자 관점] 로딩, 링크, 초기화의 3단계로 구성 == BlackBox
2. 런타임 데이터 영역(Runtime Data Area)
- 메모리 영역 : JVM이 클래스 파일을 저장&실행 하기 위한 영역
(1) Method Area : class 변수, method 관련 정보, constant pool, static 변수 등이 저장되는 영역. 모든 thread를 공유.
(2) Heap Area : 프로그램 실행 중 new 연산에 의해 생성된 object가 저장되는 영역. GC의 target area.
(3) Stack Area : Method 내에서 사용하는 data( parameter, 지역 변수, frame data, return 값 등 )을 저장하는 영역
(4) PC Register : 현재 수행 중인 JVM 명령어의 주소 값을 저장해두는 영역
(5) Native Method Stack : Java 이외의 언어로 작성된 native code를 위한 영역 (C, C++ 등)
3. 실행 엔진 (Execution Engine)
- 메모리 뿐 아니라, 파일 시스템 엑세스, 네트워크 입출력을 위한 resource 관리 등 운영체제 호환 기능
- Interpreter
- JIT 컴파일러
(1) 중간 코드 생성기
(2) 코드 최적화 프로그램
(3) 타겟 코드 생성기
(4) 프로파일러
- Garbage Collector
- 자바 네이티브 메소드 인터페이스
<참조 1> https://www.youtube.com/watch?v=QHIWkwxs0AI
<참조 2> https://java.com/ko/download/help/whatis_java.html
<참조 3> https://www.itworld.co.kr/tags/53379/jvm/110837
'Java > Definition&Grammar' 카테고리의 다른 글
[Java] This 란? (0) | 2022.07.12 |
---|---|
[Java] Getter, Setter 쓰는 이유 (0) | 2022.06.17 |
[Java] Interface (0) | 2021.03.24 |
[Java] 오버로딩 & 오버라이딩 (0) | 2021.03.15 |
댓글