728x90
JVM
- 자바 코드를 컴파일해서 얻은 바이트 코드를 해당 운영체제가 이해할 수 있는 기계어로 바꿔 실행시켜주는 역할
- 크게 Class Loader, Execution Engine, Garbage Collector, Runtime Data Area 로 나뉜다.
1. Class Loader
- .java파일을 컴파일하면 .class파일이 생성되는데 이렇게 생성된 .class파일을 엮어서 JVM이 운영체제로부터 할당받은 메모리영역인 Runtime Data Area로 적재하는 역할
- 자바 애플리케이션이 실행중일 때 수행된다.
2. Execution Engine
- Class Loader에 의해 메모리에 적재된 클래스(바이트 코드)들을 기계어로 변경해 명령어 단위로 실행하는 역할
- 하나하나 실행하는 인터프리터(Interpreter) 방식과 JIT(Just-In-Time) 방식이 있다.
- JIT 컴파일러 → 적절한 시간에 전체 바이트 코드를 네이티브 코드로 변경해서 Execution Engine이 네이티브로 컴파일된 코드를 실행하는 것으로 성능을 높인다.
3. Garbage Collector (GC)
- Heap 메모리 영역에 생성된 객체들 중에서 참조되지 않는 객체들을 탐색 후 제거하는 역할
- 정확한 시간을 알 수 없다.
- GC가 수행되는 동안 GC를 수행하는 쓰레드가 아닌 다른 쓰레드는 정지된다.
- Full GC가 일어나서 수 초간 모든 쓰레드가 정지한다면 장애로 이어지는 치명적 문제 발생
4. Runtime Data Area
- JVM의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터를 적재
- Method Area, Heap Area, Stack Area, PC Register, Native Method Stack 로 나뉜다.
- Method Area
- 클래스 멤버 변수, 메소드 정보, Type(Class or interface) 정보, Constant Pool, static, final 변수 등이 생성된다.
- 모든 Symbolic Refernce를 포함하고 있다.
- Heap Area
- 동적으로 생성된 오브젝트와 배열이 저장되는 곳으로 Garbage Collection의 대상이 되는 영역이다.
- Stack Area
- 지역 변수, 파라미터 등이 생성되는 영역, 동적으로 객체를 생성하면 실제 객체는 Heap에 할당되고 해당 레퍼런스만 Stack에 저장된다.
- Heap에 있는 오브젝트가 Stack에서 참조 할 수 없는 경우 GC의 대상이 된다.
- PC Register
- 현재 쓰레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역이다.
- CPU의 PC Register와 다르다.
- Native method stack
- 자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역이다.
자바의 버전별 변화
1. JDK 1.0a- 1994년
- 1995년 5월 23일
- 자바 언어의 발표
- 1997년 2월 19일
- Inner Class
- JavaBeans
- RMI
- Reflection
- Unicode
- 국제화
- 1998년 12월 8일
- strictfp
- SWING CORBA
- Collections
- JDK → J2SE
- 2000년 3월 8일
- HotSpot JVM
- JNDI
- JPDA
- JavaSound
- RMI → CORBA 지원
- assert
- regular Expression
- NIO
- IPv6
- XML API
- JCE
- JSSE
- JAAS
- Java Web Start
- 2004년 9월 30일
- generics
- annotaion
- auto boxing / unboxing
- enumeration
- 가변길이 파라미터
- static import
- concurrency API
- 1을 빼고 표시
- 2006년 12월 11일
- interface에 @Override 추가
- JDBC 4.0
- Scripting Language Support
- Java Compiler API
- Pluggable annotation
- J2SE → Java SE 로 변경
- 2011년 7월 7일
- diamond operator ( <> )
- try-resource
- multi-catch
- switch문에 String 사용
- concurrency API (new)
- File NIO (new)
- Java2D 지원
- dynamic Language 지원
- 2014년 3월 18일
- lambda expression
- type annotaion
- stream api 추가
- repeating annotaion
- static link library
- interface default method
- unsigned integer 계산
- 날짜와 시간 API ( new ) → JodaTime
- rhino 대신 nashorn javascript 엔진 탑재
- 32비트 지원 마지막 공식 버전
- 2017년 9월 21일
- Jingsaw 기반 런타임 모듈화
- JShell 추가
- private interface method
- immutable collection
- 통합 로깅
- HTTP/2
- HTML 5 JavaDoc
- 프로퍼티 파일에 UTF-8 지원
- 64비트 버전만 출시
- 2018년 3월 20일
- var 키워드를 이용한 지역타입추론
- 병렬처리 가비지 컬렉터
- 개별 Thread 로 분리된 Stop-The World
- 2018년 9월 25일
- lambda 파라미터에 대한 지역변수 문법
- 엡실론 가비지 컬렉터
- HTTP 클라이언트 표준화
- OracleJDK의 독점기능이 OpenJDK에 이식
- Method Area
'자바 스터디' 카테고리의 다른 글
리플렉션(Reflection) ? (0) | 2021.11.17 |
---|---|
GC ( Garbage Collection ) ? (0) | 2021.11.10 |
자바의 컴파일 과정과 JVM에서 HEAP의 변화 (0) | 2021.11.03 |
JVM( Java Virtual Machine ) 이란 (0) | 2021.10.27 |
자바의 발전과정 (0) | 2021.10.21 |