19장 - 이쯤에서 자바의 역사와 JVM에 대해서 알아보자
자바의 모토
- Write Once, Run Anywhere (WORA)
JDK의 플랫폼에 따른 차이
- Java 버전에서 제공되어야 하는 표준 문서가 만들어지면 그 기준에 해당하는 각 벤더에 맞는 JDK가 별도로 만들어짐
우분투
- 리눅스 OS
- OpenJDK가 기본적으로 설치되어 있음
WAS
- Web Application Server
자바에서 사용되는 용어
- JDK: Java Development Kit
- J2SE: Java 2 Standard Edition
- Java SE: Java Standard Edition
- JDK: Java Development Kit
- JRE: Java Runtime Environement
- 자바를 실행할 수 있는 환경의 집합(실행만을 위한 환경)
- JRE만 설치하면 자바를 컴파일하는 등의 각종 프로그램이 제외된 상태로 설치됨
자바 언어의 특징
It should be "simple, object-oriented and familiar"
자바는 "단순하고, 객체지향이며, 친숙"해야 한다
It should be "robust and secure"
자바는 "견고하며, 보안 상 안전"하다
- 컴파일할 때와 실행할 때 문법적 오류 체크함
- 분산 환경에서 사용하기 위해 디자인됨(보안 매우 중요)
- 네트워크 환경에서 클라이언트로 다운로드한 승인받지 않은 프로그램은 실행할 수 없도록 되어 있음
It should be "architecture-neutral and portable"
자바는 "아키텍처에 중립적이어야 하며 포터블"해야 한다
- 아키텍처에 중립적인 바이트 코드 생성함
- 자바의 버전만 동일하다면 동일한 프로그램은 어떤 플랫폼에서도 실행 가능
- 프로그램은 어떤 플랫폼에서도 동일한 결과 나옴
- 하드웨어와 소프트웨어 아키텍처에 따른 데이터 타입의 호환성에 문제 발생 x
- 이러한 호환성과 포터블한 환경 제공하는 것은 JVM 덕분
It should execute with "high performance"
자바는 "높은 성능"을 제공해야 한다
- 자동화된 가비지 컬렉터는 낮은 우선 순위의 쓰레드로 동작하기에 보다 높은 성능 낼 수 있음
- 보다 빠른 성능 위해 네이티브한 언어로 작성한 부분을 자바에서 사용할 수 있게 되어 있음
It should be "interpreted, threaded, and dynamic"
자바는 "인터프리트 언어이며, 쓰레드를 제공하고, 동적인 언어"이다
- 인터프리터는 자바 바이트 코드를 어떤 장비에서도 수행할 수 있게 해줌
- 멀티 쓰레드 환경 제공하기에 동시에 여러 작업 수행 가능
- 컴파일러는 컴파일 시 매우 엄격한 정적인 점검 수행
- 실행 시 동적으로 필요한 프로그램들 링크시킴
JIT 컴파일러
- JIT = Just-In-Time
- 동적 변환(dynamic translation)
- 프로그램 실행을 보다 빠르게 하기 위함
- 명칭은 컴파일러지만 실행 시 적용되는 기술
컴퓨터 프로그램 실행하는 방식
인터프리트(interpret) 방식 | 정적(static) 컴파일 방식 |
프로그램 실행 때마다 컴퓨터가 알아들을 수 있는 언어로 변환하는 작업 수행 간편하지만 성능 매우 느림 |
실행 전 컴퓨터가 알아들을 수 있는 언어로 변환하는 작업 미리 실행하기에 변환 작업은 딱 한 번만 수행함 |
JIT = 인터프리트 + 정적 컴파일 방식 혼합 |
변환 작업은 인터프리터에 의해 지속적으로 수행되나 필요한 코드의 정보는 캐시에 담아두었다(메모리에 올려두었다) 재사용함 |
javac 컴파일
- javac 명령어로 컴파일하는 단계에서 만들어진 class라는 파일 = 바이트 코드(byte code)일 뿐
- 자바의 모토 중 하나 = "Compile once, Run anywhere"
- 한 번 컴파일한 코드로 리눅스, 맥, 윈도우 등에서 모두 사용 가능
- javac 명령어 수행한다 = 텍스트로 만든 java 파일을 어떤 OS에서도 수행될 수 있도록 바이트 코드라는 파일로 만든 것뿐
- javac 명령어 수행 후 컴퓨터가 알아먹을 수 있도록 다시 변환 작업 필요 = 이 작업을 JIT 컴파일러에서 함
JIT 장단점
장점 | 단점 |
반복적으로 수행되는 코드는 매우 빠른 성능을 보임 | 처음 시작할 때에는 변환 단계를 거쳐야 하므로 성능이 느림 최근 들어 CPU 및 JDK 성능 향상되어 단점 많이 보안된 편 |
Hotspot
Hotspot 클라이언트 컴파일러
- CPU 코어가 하나뿐인 사용자를 위해 만들어짐
- 애플리케이션 시작 시간 빠르게 하고, 적은 메모리를 점유하게 함
- 코어가 많은 장비에서 애플리케이션을 돌리기 위해 만들어짐
- 애플리케이션 수행 속도에 초점 맞춰져 있음
서버 컴파일러
- 2개 이상의 물리적 프로세서
- 2GB 이상의 물리적 메모리
- 위 두 조건 충족 시 Oracle의 JVM은 서버 컴파일러 선택
(자바가 시작 시 알아서 클라이언트 장비인지 서버 장비인지 확인)
명시적으로 JVM 종류 지정하는 방법
클라이언트 컴파일러
$ java -server Calculator
서버 컴파일러
$ java -server -Xml512m Calculator
- -Xms: JVM 시작 메모리 크기 지정하는 옵션
- OS에 따라 클라이언트 컴파일러 vs 서버 컴파일러 사용할지 정해져 있기도 하나, 윈도우는 기본적으로 지정해주지 않으면 클라이언트 컴파일러 사용됨
자바 필수 용어
JVM (Java Virtual Machine; 자바 가상 머신)
- 작성한 자바 프로그램이 수행되는 프로세스
- java라는 명령어 통해 애플리케이션 수행되면
- ➡ 이 JVM 위에서 애플리케이션이 동작함
- ➡ JVM이 작성한 프로그램을 찾고 실행하는 일련의 작업 진행
GC (Garbage Collector; 가비지 컬렉터)
- 자바 메모리 관리를 JVM이 알아서 해줌
- 이때 JVM 내에서 메모리 관리해주는 역할
자바의 GC
자바에서 일반적으로 메모리가 살아가는 과정
- Eden 영역에서 객체 생성됨
- Eden 영역이 꽉 차면 살아있는 객체만 Survivor로 복사되고, 다시 Eden 영역을 채움
- Survivor 영역이 꽉 차게 되면 다른 Survivor 영역으로 객체가 복사됨
이때 Eden 영역에 있는 객체들 중 살아있는 객체들도 다른 Survivor 영역으로 감
즉, Survivor 영역의 둘 중 하나는 반드시 비어있어야 함
- 여기까지는 마이너(minor) GC 혹은 영(Young) GC라고 부름
- 여기서의 GC는 가비지 컬렉터가 아닌, 가비지 컬렉션을 의미
- 그러다 오래 살아있는 객체들은 Old 영역으로 이동
- 지속적으로 이동하다 Old 영역이 꽉 차면 GC 발생하는데 이것을 메이저(major) GC 혹은 풀(full) GC라 부름
- Young GC가 Full GC보다 빠름
- Young GC는 일반적으로 더 작은 공간이 할당되고 객체들을 처리하는 방식도 다름
- But 전체 힙 영역을 영 영역으로 만들면 장애로 이어질 확률 높아짐
오라클 JDK에서 제공하는 GC의 방식(GC의 종류)
- Serial GC
- Parallel Young Generation Collector
- Parallel Old Generation Collector
- Concurrent Mark & Sweep Collector (줄여서 CMS)
- G1(Garbage First, Java 7부터 추가됨)
- WAS로 사용하는 JVM에서 사용하면 안 되는 것 = Serial GC
- 이는 -client 옵션을 지정했을 때 사용됨
- 클라이언트용 장비에 최적화된 GC이기에 만약 WAS에서 이 방식 사용 시 GC 속도가 매우 느려 웹 어플리케이션이 엄청 느려짐
'Backend > Java' 카테고리의 다른 글
[자바의 신] 21장 (0) | 2022.08.09 |
---|---|
[자바의 신] 20장 (0) | 2022.07.26 |
[자바의 신] 18장 (0) | 2022.07.26 |
[자바의 신] 17장 (0) | 2022.07.25 |
[자바의 신] 16장 (0) | 2022.07.25 |
댓글