✔️이 글은 [자바의 신 - 이상민 지음] 도서를 바탕으로 정리한 글입니다.
자바의 역사
자바는 1991년에 "Green" 프로젝트가 생기면서 모태가 탄생해 "Oak"라는 이름에서 1995년 "Java"라고 바뀌면서 Write Once, Run Anywhere(WORA)를 목표로 1996년에 JDK 1.0을 출시했다.
1998년 J2SE라는 이름으로 자바의 기본 버전 명칭이 바뀌고 2006년 Java SE 6가 출시되었다.
JDK의 플랫폼에 따른 차이
각 운영체제에 최적화된 JDK가 있어 어떤 OS에서 개발하든지 JDK의 버전만 맞으면 적용할 다른 OS에서 컴파일해서 프로그램을 구동시킬 수 있다. 즉, Orcale JDK로 개발하고 IBM의 JDK에서 컴파일해도 된다는 의미이다.
OpenJDK는 라이선스 문제가 없는 완전 오픈소스 버전의 JDK이고, JRockit은 WebLogic이라는 WAS(Web Application Server)의 성능 최적화를 위해 만든 JDK이다.
WAS는 DB 조회, 여러개의 트랜잭션 관리나 다양한 로직 처리를 요구하는 동적인 컨텐츠를 제공하기 위해 만들어진 Application Server로 HTTP를 통해 컴퓨터나 장치에 애플리케이션을 수행해주는 미들웨어(소프트웨어 엔진)이다. WAS는 JSP, Servlet 구동환경을 제공해 웹 컨테이너(Web Container) 혹은 서블릿 컨테이너(Servlet Container)라고 부른다.
MiddleWare는 Client와 DB Server 사이에서 Client에게 요청을 받고 대부분의 로직이 수행되며, 데이터 조작이 필요할 땐 DB에게 부탁해 로직을 처리하면 그 결과를 Client에 보내주는 역할을 한다.
JDk, J2SE, Java SE 외에 자바에서 사용되는 다른 용어들
JDK(Java Development Kit)
자바 개발 키트로 자바로 개발을 하는데 필요한 도구들이 들어 있다. 대표적으로 컴파일러, 디버거, JRE 등이 있다.
J2SE(Java 2 Standard Edition), Java SE(Java Standard Edition)
JDK를 지칭하는 다른 이름 중 하나
JRE(Java Runtime Environment)
자바 실행환경으로 자바로 만들어진 프로그램을 실행시키는데 필요한 라이브러리, 각종 API, JVM이 포함되어 있다.
자바 언어의 특징은 다음과 같다
단순하고, 객체지향적이며, 친숙
다른 언어를 배운 사람이면 쉽게 배울 수 있을 만큼 단순하며, 다형성과 캡슐화 등 객체지향적 구조로 되어 있고, 개발시 필요한 기능들이 이미 API로 구현되어 있는 경우가 많아 쉽게 개발할 수 있다.
견고하며, 보안상 안전
자바는 포인터 개념이 없어 견고한 소프트웨어가 될 수 있게 하고, 자바에서 사용하는 분산 환경에서는 외부에서 침입이 불가능한 애플리케이션을 만들 수 있도록 해준다.
아키텍처에 중립적이어야 하며 포터블
다양한 하드웨어 아키텍처에서 수행할 수 있어야 해서 아키텍처에 중립적인 바이트 코드를 생성한다. 어떤 플랫폼에서든 동일한 결과가 나오는 포터블한 환경을 제공한다.
높은 성능
자바는 실행환경에서 최대한의 성능을 낼 수 있도록 되어 있다. 자동화된 GC는 낮은 우선순위의 쓰레드로 동작해 높은 성능을 낼 수 있다. 또 빠른 성능을 위해 네이티브한 언어로 작성된 부분을 사용할 수 있게 되어있다.
인터프리트 언어이며, 쓰레드를 제공하고, 동적인 언어
자바 인터프리터는 자바 바이트 코드를 어떤 장비에서도 수행할 수 있도록 해줘서 빠른 개발 환경을 제공한다. 멀티 쓰레드 환경으로 동시에 여러 작업을 수행할 수 있고, 실행시에 동적으로 필요한 프로그램들을 링크시킨다.
자바의 버전별 차이
- JDK 1.0 : 가장 최초의 버전
- JDK 1.1 : 내부 클래스 추가, JavaBeans(컴포넌트 모델 중 하나), JDBC(자바 DB에 데이터 담기 위한 API), RMI(원격 JVM에 있는 메소드 호출하는 기술) 추가
- JDK 1.2 : JIT 컴파일러 추가, Collections 프레임웍 추가
- JDK 1.3 : HotSpot JVM 추가, JNDI(Java Naming and Directory Interface, 객체를 쉽게 찾기 위해 이름을 붙여주는 것)
- JDK 1.4 : 정규 표현석 추가, NIO(New Input/Output)라는 non-blocking 추가
- Java 5 : 제네릭 추가, 어노테이션 추가, autoboxing및 unboxing 기능 추가, enum 추가, 가변인자 추가, for-each문 추가, static import 추가
- Java 6 : 안전성과 확장성 향상
- Java 8 : 람다 표현식이 가능해짐
JIT 컴파일러는 도대체 뭘까?
JIT은 Just-In-Time이라는 의미로 Jit을 사용하는 언어에는 자바와 .NET 등 자바에서만이 아닌 다른 언어에서도 사용된다.
JIT은 동적 변환(dynamic translation)으로도 볼 수 있는데 컴파일러지만 실행시에 적용이 된다.
컴퓨터 실행 방식엔 두가지가 있다.
- 인터프리트(interpret) 방식 : 컴파일된 바이트 코드를 인터프리터가 한 줄 씩 해석하여 컴퓨터가 알아들을 수 있는 기계어로 번역하는 방식
- 정적(static) 컴파일 : 실행하기 전 미리 컴퓨터가 알아 들을 수 있는 기계어로 번역하는 방식으로 한번만 수행
JIT은 이 두가지 방식을 혼합한 것으로 변환 작업은 인터프리터에 의해 지속적으로 수행되지만, 필요한 코드 정보는 캐시에 담아 두었다가 재사용한다.
javac로 하는 컴파일은 플랫폼 독립성을 확보하기 위해 바이트코드(.class)로 바꿔주는 거고, JIT은 그 바이트코드를 컴퓨터가 알아들을 수 있게 변환해주는 역할을 한다.
JIT을 사용하면 반복적으로 수행되는 코드는 빠르게 처리되지만, 처음에 시작할 때 변환 작업으로 느리다.
HotSpot은 또 뭐야?
자바에서는 두가지 컴파일러를 제공한다.
- HotSpot 클라이언트 컴파일러 : CPU 코어가 하나인 사용자를 위해 만들어진 컴파일러로 애플리케이션 시작 시간을 빠르게 하고, 적은 메모리를 점유하게 함
- HotSpot 서버 컴파일러 : 코어가 많은 장비에서 애플리케이션을 돌리기 위해 만들어진 컴파일러로 수행 속도에 초점이 맞춰져 있음
HotSpot이라는 이름은 이전 버전에서의 가상 머신과 구분하기 위해 지어졌다. 이전 버전의 가상머신은 Classic VM이라고 표현한다.
장비가 아래 조건을 만족하면 서버 컴파일러를 사용하면된다.
- 2개 이상의 물리적 프로세서
- 2GB 이상의 물리적 메모리
명시적으로 컴파일러 지정시 java 명령어에 옵션을 추가해주면 된다.
java -server 클래스명
java -client 클래스명
OS마다 사용할 컴파일러가 지정된 경우가 있는데 윈도우는 기본적으로 클라이언트 컴파일러가 사용된다.
자바를 배우면 꼭 알아야 하는 용어
JVM(Java Virtual Machine)
자바 가상 머신으로 자바 프로그램을 찾고 실행하는 일련의 작업이 수행되는 공간이다. 자바의 메모리 관리를 해주는 가비지 컬렉터가 JVM에 포함되어 있다.
자바의 GC는 어떻게 진행되나요?
Java 7부터 공식적으로 사용할 수 있는 G1(Garbage First)라는 GC를 제외한 나머지 JVM은 Heap이라는 공간에 객체를 관리한다.
Heap 영역
Young 영역
Eden 영역과 두 개의 Survivor로 나뉘는데 객체를 생성하자마자 Eden 영역에 저장됐다가 Eden이 꽉차면 살아 있는 객체만 Survivor로 복사되고, 다시 Eden영역에 새로운 객체가 저장된다. Survivor도 꽉차면 다른 Survivor로 객체들이 옮겨가는데 이때 Eden에 살아 있는 객체들도 다른 Survivor로 같이 복사돼 Survivor 둘중 하나는 반드시 비어있게 해준다.
이 과정을 Minor GC, Young GC(Garbage Collection)이라 한다.
Old 영역
오래된 객체가 자리잡는 영역으로 Old 영역이 꽉차면 GC(Garbage Collection)이 발생하는데 이를 Major GC, Full GC라고 하고 일반적으로 Young 영역보다 큰 공간이 할당돼 더 느리다.
Perm 영역
클래스나 메소드에 대한 정보가 쌓인다.
오라클 JDK에서 제공하는 GC의 방식
- Serial GC : WAS로 사용하는 JVM에선 사용 x
- Parallel Young Generation Collector
- Parallel Old Generation Collector
- Concurrent Mark & Sweep Collector (CMS)
- G1(Garbage First)
'도서 > 자바의 신' 카테고리의 다른 글
[도서/자바의 신] #21 실수를 방지하기 위한 제네릭이라는 것도 있어요 (0) | 2022.12.29 |
---|---|
[도서/자바의 신] #20 가장 많이 쓰는 패키지는 자바랭 (0) | 2022.12.29 |
[도서/자바의 신] 부록 #3 float와 double (0) | 2022.12.27 |
[도서/자바의 신] #17 어노테이션이라는 것도 알아야 한다 (1) | 2022.12.25 |
[도서/자바의 신] #16 클래스 안에 클래스가 들어갈 수도 있구나 (0) | 2022.12.25 |