[자바의 신 부록] 자바의 역사와 JVM
[Programming]/Java 2015. 1. 4. 01:23 |▶자바의 역사
* 1991, "Green"이라는 프로젝트가 생기면서 자바의 모태가 탄생하기 시작했다.
James Gosling, Mike Sheridan, Patrick Naughton 이 TV와 시청자가 서로 상호 작용을 하는 (interactive한) 것을 만들기 위해 시작되었다.
→ Oak라는 언어.
* 1995, 커피의 이름을 본따 Java라고 이름이 바뀌면서 자바 기술이 시작되었고, Java언어를 만들면서 "Write Once, Run Anywhere WORA"라는 모토가 만들어 졌으며, 여러 플랫폼에서 수행할 수 있는 개발 언어를 목표로 개발되었다.
* 1996, JDK1.0이 출시되었다.
* 1997, JDK 1.1은 3주만에 22만 다운로드를 기록하였다. (JDK : Java Development Kit)
* 1998, J2SE라고 자바의 기본 버전 명칭이 바뀌면서 J2SE 1.2 출시되었다.(J2SE : Java 2 Standard Edition)
→ 바뀐 이유 : 기업 등에서 만드는 시스템을 개발하기 위한 J2EE라는 Enterprise Edition과 블랙베리와 같은 전화기에서 아직도 사용하고 있는 J2ME라는 Micro Edition과의 혼동을 막기 위함.
* 2000, J2SE 1.3 출시
* 2002, J2SE 1.4 출시
* 2004, J2SE 5 출시
* 2006, Java SE 6 출시
→ Java SE 6까지는 Sun Microsystems라는 회사에서 자바에 대한 주요 스펙을 만들고 java를 만들어 왔다.
* 2011, Java SE 7 출시
→ Java SE 7부터는 Oracle이 Sun Microsystems를 인수하였다.
▶자바에서 사용되는 용어들
* JDK : Java Development Kit
* J2SE : Java 2 Standard Edition
* Java SE : Java Standard Edition
* JRE : Java Runtime Environment : 자바를 실행할 수 있는 환경의 집합
* JVM : Java Virtual Machine (자바 가상 머신)
▶자바 언어의 특징
* It should be "Simple, object-oriented and familiar." (단순하고 객체지향적이며, 친숙해야 한다.) * It should be "robust and secure." (견고하며 보안상 안전해야 한다.) * It should be "architecture-neutral and portable." (아키텍처에 중립적이어야 하며, 포터블해야 한다.) * It should execute with "high performance". (높은 성능을 제공해야 한다.) * It should be "interpreted, threaded, and dynamic." (인터프리트 언어이며, 쓰레드를 제공하고, 동적인 언어이다.) - 멀티 스레드 환경을 제공하기 때문에 동시에 여러 작업을 수행할 수 있다. |
▶JIT컴파일러란?
- JIT(Just-In-Time)를 사용하는 언어에는 자바와 .NET 등이 있다.
- JIT는 쉽게 말하면 "동적 변환"이라고 보면 된다. 이것을 만든 이유는 프로그램 실행을 보다 빠르게 하기 위해서이다.(명칭이 컴파일러지만, 실행시에 적용되는 기술이다.)
- JIT는 인터프리트 방식과, 컴파일 방식 두가지를 합한 것이라고 보면 된다. 변환 작업은 인터프리터에 의해서 지속적으로 수행되지만, 필요한 코드의 정보는 캐시에 담아두었다가 (메모리에 올려두었다가) 재사용하게 된다.
- javac 라는 명령어를 수행한다는 것은 우리가 텍스트로 만든 java파일을 어떤 OS에서도 ㅅ행도리 수 있도록 바이트코드라는 파일로 만든 것이다. 컴퓨터가 알아먹을 수 있도록 JIT컴파일러에서 변환작업을 해준다.
- JIT를 사용하면 반복적으로 수행되는 코드는 매우 빠른 성능을 보인다는 장점이 있지만, 반대로 처음에 시작할 때에는 변환단계를 거쳐야 하므로 성능이 느리다는 단점이 있다. (최근 들어 많이 개선됨.)
* 자바 프로그램이 수행되는 절차
- JVM → 기계코드 : JIT에서 수행.
▷컴퓨터 프로그램을 실행하는 방식
인터프리트 방식 |
정적 컴파일 방식 |
: 프로그램을 실행할 때마다 컴퓨터가 알아 들을 수 있는 언어로 변환하는 작업을 수행한다. - 장점 : 간편하다. - 단점 : 성능이 매우 느리다. |
: 실행하기 전에 컴퓨터가 알아 들을 수 있는 언어로 변환하는 작업을 미리 실행한다. - 장점 : 변환 작업은 딱 한 번만 수행한다. (성능 좋음)
|
▶HotSpot
HotSpot 클라이언트 컴파일러 |
HotSpot 서버 컴파일러 |
: CPU 코어가 하나뿐인 사용자를 위해 만들어진 것. (요즘에는 듀얼코어나, 쿼드코어도 사용하지만 예전에는 대부분 pc의 CPU코어 개수는 하나였다.) → 애플리케이션 시작 시간을 빠르게 하고, 적은 메모리를 점유하도록 한다. |
: cpu 코어가 많은 장비에서 애플리케이션을 돌리기 위해 만들어진 것. → 애플리케이션 수행 속도에 초점이 맞추어져 있다. |
* 자바가 시작할 때 자동으로 서버 컴파일러를 선택하는 기준 (아래 기준을 만족하면 JVM은 서버 컴파일러를 선택한다.)
- 2개 이상의 물리적 프로세서
- 2GB 이상의 물리적 메모리
** 윈도우는 기본적으로 지정해주지 않으면 클라이언트 컴파일러가 사용된다.
** 사용자가 명시적으로 어떤 종류의 JVM인지 지정하고 싶은 경우, 클라이언트 JVM은 -client, 서버 JVM은 -server라고 지정해준다.(우리가 지금까지 실행한 java명령에)
ex)
$ java -server Calculator
$ java -server -Xms512m Calculator // 옵션추가 (-Xms라는 옵션으로 512MB의 시작크기 지정)
▶자바의 GC(Garbage Collection)
: 사용하고 남아있는 전혀 필요없는 객체들이 속한다. "GC가 발생했다."
- JDK 7부터 공식적으로 사용할 수 있는 G1(Garbage First)라는 가비지 컬렉터를 제외한 나머지 JVM은 영역을 나누어 힙이라는 공간에 객체들을 관리한다.
▷ 자바의 힙 영역
* Young 영역 : 젊은 객체들이 존재
- Eden 과 두 개의 Survivor 영역으로 나뉜다.
- Eden : 객체를 생성하자마자 저장되는 장소.
* Old 영역 : 늙은 객체들이 존재
* Perm 영역 : 클래스나 메소드에 대한 정보 등등
▷자바에서 메모리가 살아가는 과정
** Minor GC (또는 Young GC)
① Eden 영역에서 객체가 생성된다.
② Eden 영역이 꽉 차면 살아있는 객체만 Survivor 영역으로 복사되고, 다시 Eden 영역을 채우게 된다.
③ Survivor 영역이 꽉 차게 되면 다른 Survivor 영역으로 객체가 복사된다. 이 때, Eden 영역에 있는 객체들 중 살아있는 객체들도 다른 Survivor 영역으로 간다. 즉, Survivor 영역의 둘 중 하나는 반드시 비어 있어야만 한다.
** Major GC (또는 Full GC)
④ 오래 살아 있는 객체들은 Old 영역으로 이동하는데, 지속적으로 이동하다가 Old 영역이 꽉차면 GC가 발생한다.
**Young GC가 Full GC보다 빠르다.
→ 왜냐하면 일반적으로 더 작은 공간이 할당되고, 객체들을 처리하는 방식도 다르기 때문이다. 그렇다고, 전체의 힙 영역을 young영역으로 만들면 장애로 이어질 확률이 매우 높아진다.
▷GC의 방식
- Serial GC
- Parllel Young Generation Collector
- Parallel Old Generation Collector
- Concurrent Mark & Sweep Collector(CMS)
- G1 (JDK7.0부터 추가)
'[Programming] > Java' 카테고리의 다른 글
Java의 기초 문법★ (0) | 2015.01.04 |
---|---|
[자바의 신 부록] 비트 연산자란 ? (0) | 2015.01.03 |
[자바의 신 부록] float와 double의 범위 (0) | 2015.01.03 |
[자바의신 부록] jdk / eclipse 설치하기 (0) | 2015.01.03 |