학습 목표
학습 결과 요약
- Write Once, Run Anywhere : Java 언어는 여러 플랫폼에서 수행할 수 있는 개발 언어를 목표로 개발 되었다.
- 바이트코드를 기계 코드로 변환하는 작업을 JTI 컴파일러에서 한다.
학습 내용
Write Once, Run Anywhere
- 자바는 여러 플랫폼에서 수행할 수 있는 개발 언어를 목표로 개발되었음
- Java 버전에서 제공되어야 하는 표준 문서가 만들어지면 그 기준에 해당하는 각 벤더에 맞는 JDK가 별도로 만들어 진다.
JDK & JRE
!http://sahet.net/src/software/JavaSEPlatform.png
- JDK (Java Development Kit) :
- JRE (Java Runtime Environment) : 자바를 실행할 수 있는 환경의 집합
자바 언어 특징
- 단순하고 객채지향이며 친숙해야 한다 자바는 객체지향으로 디자인 되었다. 자바로 개발할 때에는 모든 것을 만들 필요가 없고 필요한 기능들은 API를 통해서 제공한다
- 견고하며 보안상 안전하다 자바는 기본적으로 분산 환경에서 사용하기 위해 디자인 되었다. 자바 기술을 외부에서 침입이 불가능한 애플리케이션을 만들 수 있도록 해준다.
- 높은 성능 자동화된 가비지 컬렉터는 낮은 우선 순위의 쓰레드로 동작하기 때문에 보다 높은 성능을 낼 수 있다.
- 인터프리트 언어, 쓰레드 제공, 동적인 언어 자바 인터프리터는 자바 바이트 코드를 어떤 장비에서도 수행할 수 있도록 해준다.
자바는 멀티 쓰레드 환경을 제공하기 때문에, 동시에 여러 작업을 수행할 수 있다.
자바 컴파일러는 컴파일시 매우 엄격한 점검을 수행한다. 그리고 실행시에 동적으로 필요한 프로그램들을 링크시킨다.
자바 버전별 주요 변화
JDK 1.2
- JIT 컴파일러 추가
- JIT (Just-In-Time) 은 어떤 메서드 일부 혹은 전체 코드를 네이티브 코드로 변환하여 JVM 에서 번역하지 않도록 함으로써 보다 빠른 성능을 제공하는 기술
- 바이트코드를 기계 코드로 변환하는 작업을 JIT 컴파일러에서 한다 JIT를 사용하면 반복적으로 수행되는 코드는 매우 빠른 성능을 보인다. 하지만 처음에 시작할 때에는 변환 단계를 거쳐야 하므로 성능이 느린 단점이 있다.
JDK1.4
- 정규표현식 추가
- NIO non-blocking 추가 : java.io 패키지에서 제공하는 기능의 단점을 보완하기 위한 것
Java 5
- 제네릭 추가
- 어노테이션
- autoboxing, unboxing
- enum
- varargs
Java 6
Java 8
JVM 아키텍처
!http://ksoong.org/troubleshooting/intro/img/hotspotjvm-1.PNG
JVM 은 세 가지 주요 컴포넌트로 되어 있다.
- 클래스 로더 서브시스템
- Runtime Data Areas
- Execution Engine
자바의 GC
!https://4.bp.blogspot.com/-id4mr-lULDI/VvPOd3L964I/AAAAAAAAFQI/CJyyQuxaWgkITVpkXVI0diN93HtsRfxWg/w551-h335/Java+Garbage+Collection+heap.png
-
Young 영역
- 젊은 객체들이 존재
- Eden : 객체를 생성하자마자 저장되는 장소는 Eden 이다
- 2개 Survivor 영역
- Eden 영역이 꽉 차면 살아있는 객체만 Survivor 영역으로 복사된다. 다시 Eden 영역을 채우게 된다.
- Survivor 영역이 꽉 차게 되면 다른 Survivor 영역으로 객체가 복사된다.
이때, Eden 영역에 있는 객체들 중 살아있는 객체들도 다른 Survivor 영역으로 간다.
즉, Survivor 영역의 둘 중 하나는 반드시 비어 있어야만 한다.
- Old 영역 : 늙은 객체
- Perm 영역 : 클래스나 메서드에 대한 정보가 쌓인다
- 마이너 GC 혹은 영 GC라고 부른다. 가비지 컬렉션
-
Old 영역
- 오래 살아있는 객체들을 Old 영역으로 이동한다.
- Old 영역이 꽉 차면 GC 가 발생하는데 이것을 메이저 GC, 풀 GC 라고 부른다. 가비지 컬렉션
Young GC 가 풀 GC 보다 빠르다. 왜냐하면 일반적으로 더 작은 공간이 할당되고, 객체들을 처리하는 방식도 다르기 때문이다.
- 가비지 컬렉터 종류
- Serial GC
- Parallel GC
- Parallel Old GC
- CMS (Concurrent Mark Sweep) GC
- G1 (Garbage First) GC
예시
참고
https://javarevisited.blogspot.com/2011/04/garbage-collection-in-java.html#axzz861kIh1Jm