두루뭉실하게 알고 있던 개념을 조금 제데로 공부하기 위해 글을 작성한다.
개인적으로 자바가 가지는 가장 큰 장점이라고 생각하는 점은
바로 모든 기기에 호환이 가능하다는 점이다.
이게 무슨 말이나면
자바로 개발된 언어는 맥, 윈도우, 리눅스 등 자바가 설치되어 있으면 모든 기기에서 동작
한다는 말이다.
이게 가능한 원리는 바로JVM
때문이다.
JVM은 Java Virtual Machine의 약자로 스택 기반의 가상머신
이다.
일반적인 자바 프로그램의 실행 과정은 다음과 같다.
- 프로그램이 실행되면 JVM은 OS로부터 프로그램이 필요한 메모리를 받는다.
- 자바 컴파일러(javac)가 자바 소스코드(java)를 읽어들여 자바 바이트코드(class)로 변환
- Class Loader를 통해 자바 바이트코드(class) 파일들을 jvm으로 로딩
- 로딩된 바이트코드(class)는 실행 엔진(Execution Engine)을 통해 해석
- 해석된 바이트 코드는 Runtime Data Areas에 배치되어 실행됨.
이때 JVM은 스레드 동기화 작업이나, GC와 같은 관리작업을 실행함.
- JVM내로 클래스 파일을 로드하고 링크를 통해 배치하는 작업을 수행하는 모듈이다.
- Runtime 시에 동적으로 클래스를 로드한다.
클래스를 참조할 때 클래스를 로드하고 링크하는 역할을 수행
- 클래스를 실행시키는 역할
Class Loader가 자바 바이트 코드를 배치하면 이를 실행시키는 역할을 수행
- 자바 바이트 코드(.class)를 JVM내부에서 기계가 실행할 수 있는 형태로 변경함.
- Execution Engine은 자바 바이트 코드(.class)를 한줄 씩 읽어 실행한다.
하지만 Interpreter 방식은 한 줄씩 읽어 실행시키기 때문에 조금 느리다는 단점이 있다.
- Interpreter 방식을 보완하기 위한 컴파일러.
- 인터프리터 방식으로 컴파일하다 적적한 시점에 바이트 코드 전체를 컴파일 하여 네이티브 코드로 변경하고 이후에는 인터프리팅 하지 않음.
- 네이티브 코드는 캐시에 저장되기 때문에 코드가 변환되면 빠르게 수행 가능
다음은 Java가 가 실행되면 할당되는 영역이다.
클래스 정보를 올릴 때 초기화되는 대상을 저장하기 위한 메모리 공간
- 객체를 저장하는 가상 메모리 공간이다.
- new 로 객체를 생성하면 여기 heap area에 저장된다.
- 생성된 객체들의 주소값이 저장된 공간
- 리플렉션을 사용하여 동적으로 클래스가 로딩되는 경우 사용
- New Area에서 일정 시간 참조되고 있는 객제들이 저장되는 Eden이라는 공간에 객체가 가득 차게 되면 GC(Garbage Collection)이 발생해 메모리를 정리하는데 Eden영역에 있는 값을 Survivor 1에 복사하고 이 영역을 제외한 나머지 영역의 객체를 삭제한다.
- Eden : 객체가 최초로 생성되는 공간
- Survivor Space : Eden에서 참조한 객체가 저장되는 공간
- 메소드 내에 사용되는 지역변수, 매개변수, 리턴 값 등 연산시 발생하는 값들을 저장하는 공간
- 메소드를 빠져나가면 소멸되는 공간
- Thread가 시작될 때 마다 생성되는 공간
- 스레드마다 하나씩 존재
- 현재 수행중인 JVM주소를 가짐
- 자바 바이트 코드가 아닌 실제 실행할 수 있는 기계어로 된 프로그램을 실행시키는 영역
- JAVA가 아닌 다른 언어로 작성된 프로그램을 위한 공간