Java란 객체지향언어의 대표적인 프로그램 언어.
객체지향 언어
컴파일 언어
& 인터프리터 언어
컴파일 언어
)인터프리터 언어
)객체지향 언어
로 써 객체지향의 특징인 상속, 다형성, 캡슐화, 추상 등의 특징을 사용할 수 있다.
멀티 스레드 지원
JVM을 통해 어떤 운영체제에서도 독립적
으로 자바를 사용할 수 있다.
JVM에서 자바가 사용하는 메모리를 자동으로 관리 및 최적화
해준다.
컴파일이 느리다.
예외처리를 직접해주지 않으면 컴파일이 되지 않는다.
JDK란, Java Development Kit의 약자로써 자바가 프로그램을 개발하는데 필요한 도구들을 제공해주는 환경.
JRE란, Java Runtime Enviroment의 약자로써 자바 코드를 실행시키기 위한 환경(런타임 환경).
자바 코드를 .jar
로 압축한 후 자바 컴파일러를 통해 자바 바이트코드
로 변환 후 JVM
에 의해서 코드가 실행된다.
JVM란, Java Virtual Machine의 약자로써 자바 코드의 런타임 환경을 제공해주는 주체이다.
JVM은 자바를 어떤 운영체제에서도 실행할 수 있도록 해준다.
(C, C++과 같은 언어는 컴파일된 환경에서만 실행할 수 있다.)
JVM은 운영체제에서 메모리를 할당
받는다.자바 컴파일러(javac)
가 자바 코드를 자바 바이트코드(.class)
로 변환
한다.클래스 로더
에 의해서 바이트코드는 JVM에 로드
되고 Runtime Data Area에 배치된다.인터프리터
에 의해서 바이트코드는 기계어로 해석
된다.바이트코드를 JVM에 로드하고 인터프리터에 의해 번역된 바이트코드를 Runtime Data Area에 배치하는 역할을 한다.
바이트코드를 기계어로 해석한다.
인터프리터를 보조하는 역할로써, 인터프리터가 해석할 바이트코드가 이전에 해석한적 있는지 확인하고 없다면 인터프리터가 해석 한 후 저장소에 저장한다. 해석한 적 있다면 저장소에서 해석한 내용을 가져와 사용한다.
자바가 사용하는 메모리를 관리 및 최적화 해주는 역할.
Heap영역에 있는 객체 중 사용하지 않는 객체를 삭제하여 메모리를 관리한다.
프로그램을 실행시키기 위해 운영체제에서 할당받은 메모리 공간
하나의 메소드가 호출될때 생성된다.
메서드가 실행될 때 생성되며 자바 코드의 어느 부분을 명령으로 수행해야하는지 저장해 놓는 곳.
즉, JVM명령 주소를 저장해 놓은 곳으로 Thread가 처리하는 Method의 몇번째 코드 줄을 명령으로 수행하는지 저장해 놓는 곳이다.
프로그램을 수행하면서 Thread가 담당하는 메소드의 정보(매개변수, 지역변수, 리턴값)을 저장해두는 곳.
Heap영역에 생성된 Object타입의 데이터들에 대한 참조를 위한 값들이 할당 및 원시타입 데이터 할당.
메소드 호출이 종료되면 삭제.
자바가 아닌 다른언어를 저장하는 곳.
프로그램이 실행되면서 생성되는 객체 인스턴스를 저장하는 곳으로 JVM의 모든 스레드가 공유하는 메모리 공간이다.
Young Generation과 Old Generation 영역으로 나뉘어지며 Garbage Collection의 대상이되는 곳이다.
Young Generation에는 생명주기가 짧은 젊은 객체가 저장된다.
Old Generation에는 생명주기가 긴 오래된 객체가 저장된다.
JVM에 클래스가 로드될 때 생성되며 JVM이 종료될때 까지 유지된다.
Class, Interface, static변수 등을 저장하는 메모리 공간이다.
Heap영역에 저장되어있는 객체 인스턴스를 저장하는 역할을 하며 Heap의 Young Generation에서 동작하는 GC를 Minor GC, Old Generation에서 동작하는 GC를 Majar GC라고 한다.
Reference Count
Mark and Sweep
Mark
, 불가능하다면 Reachable 상태가 되어 GC의 대상이된다.Sweep
stop the world
란 GC를 수행할 때 GC를 수행하는 스레드를 제외한 다른 스레드는 GC를 완료할 때까지 동작을 중지하는 것.Serial GC
Parallel GC
G1 GC
GC를 여러 부분으로 나눈 이유
객체 인스턴스의 대부분은 생명주기가 짧기 때문에 GC대상의 탐색 범위를 최소화 시키기 위함이다.
Major GC는 Minor GC보다 처리시간이 훨씬 오래걸리며 Stop the World와 GC 실행시간을 알지 못하는 것으로 인해 실시간 애플리케이션에서 크리티컬한 이슈가 발생할 수 있다.
그렇기 때문에 GC 모니터링을 통해 문제가 발생할 수 있는 코드를 리팩토링하거나 GC튜닝으로 GC를 효율적으로 사용할 수 있도록 해야한다.