[java]JVM JRE JDK
- study
- 2021. 6. 17. 11:07
자바 소스파일이 JVM으로 실행하는 과정
- Hello.java를 생성한다.
- Java Compiler를 통해 Hello.class파일이 생성된다. Byte Code는 플랫폼 독립적이다. OS관계 없이 동일하다. (javac 명령어)
- JVM의 Java Interpreter는 Byte Code를 한줄씩 기계어로 변환하며 그때그때 실행한다. (java 명령어)
ClassPath
- JVM이 프로그램을 실행할 때 Class 파일을 찾는데 기준이 되는 경로
- InteliJ에서는 Project Structure의 Resource에서 설정가능
JIT컴파일러 란
우리가 작성한 자바 코드는 컴파일러를 통해 바이트 코드로 컴파일이 되고, 이 바이트코드는 인터프리터를 통해 한 줄 씩 기계어로 번역되어 실행이 된다고 위에서 설명하였다. 이 과정이 있기에 자바는 속도가 느리다는 말이 나오게 되었다.
JIT 방식은 실행 시점에 자주 쓸만한 코드들을 기계어로 변환해 놓고 캐싱해 두었다가 재사용할 때 이미 변환된 기계어 코드를 사용한다. 이 과정에서 초반에 메모리를 잡아두거나 하는 선행 작업들이 있어서 초기 실행 속도는 다소 느릴 수 있다.
하지만 그 이후로는 바이트 코드를 사용할 때마다 기계어로 전환하는 작업이 줄어 들어 실행 속도가 향상된다.
JVM Runtime Data Area
- JVM이 운영되면서 운영체제로 부터 부여 받은 메모리 영역
메소드 영역
- 모든 쓰레드가 공유하는 영역
- JVM이 시작될 때 생성된다.
- 클래스와 인터페이스의 메소드에 대한 바이트코드, 전역변수 (클래스 변수), 런타임 상수 풀이 위치
힙 영역
- 객체를 저장할 때 사용하는 메모리영역
스택 영역
- 쓰레드 마다 하나씩 존재한다.
- JVM은 오직 JVM 스택에 메소드에 대한 스택 프레임을 추가하고 제거하는 동작만 실행
- 실행 되는 메소드의 스택 프레임을 가진다.
- 각 스택 프레임에는 지역변수, 메소드의 인자, 메소드의 리턴값, 리턴 번지등이 저장
- 스택 프레임은 메소드가 끝나면 사라진다.
PC 레지스터
- 쓰레드가 시작될 때 생성되며 쓰레드 마다 하나씩 존재하여 실행 할 JVM의 명령어의 주소를 가리킨다.
- 다음 실행 될 메소드 영역에 올라와 있는 바이트코드의 주소를 가르킨다.
실행 상수 풀
- 메소드 영역으로 부터 할당 받으며 클래스와 인터페이스의 상수, 메서드, 필드에 대한 모든 레퍼런스를 저장하는 영역
- 자바 프로그램에서 어떤 메서드나 필드를 참조 할 때 JVM은 런타임 상수 풀을 통해 해당 메서드나 필드의 실제 메모리상 주소를 찾아서 참조 하게 된다.
네이티브 메소드 스택
- 자바 이외의 언어로 작성된 네이티브 코드를 위한 스택
- 메소드 별 Stack Frame에는 메소드 안에 정의된 로컬변수, 매개변수, 리턴 값 등이 저장된다.
- 메소드 내 로컬변수의 배열, 피연산자 스택, 상수 풀에 대한 참조 등이 저장되고 메소드가 종료되면 제거된다. 지역변수 배열, 피연선자 스택의 크기는 컴파일 시 결정되기 때문에 스택 프레임의 크기도 메소드에 따라 크기가 달라진다.
Class Person {
String name;
}
Class Main {
public static void main (String[] args) {
Person person1 = new Person();
person.name = "suri";
Person person2 = new Person();
person.name = "dwl";
}
}
- 메소드 내에서 객체 참조 형으로 선언된 변수인 경우 지역변수로서 스택에 위치하며 힙에 저장되어 있는 객체애 대한 참조값을 가지게 된다.
- 객체 참조 형 변수의 값이 null 이라는 의미는 아무것도 참조하고 있지 않다는 의미이다.
- new 연산자는 힙 메모리에 객체를 만들고 그 객체의 참조값을 반환한다.
- 객체 참조 변수의 경우 대입, 메소드 호출시의 인자, 반환형 등으로 사용 될 때 참조 값만 전달 될 뿐, 객체 자체가 복제되어 전달되는 것은 아니다.
JDK와 JRE
- JRE (Java Runtime Environment)
- 자바 프로그램을 실행하기 위한 최소한의 환경
- 바이트 코드를 JVM으로 로드하는 역할을 수행한다.
- JDK
- JRE와 자바 프로그램 개발을 위해 필요한 모든 툴들을 모아놓은 소프트웨어 패키지
- javac
- 자바 컴파일러 자바 소스 파일을 바이트 코드로 컴파일
- java
- 자바 응용 프로그램 로더 javac로 컴파일한 바이트 코드를 해석 및 실행
- javap
- 디스어셈블러 바이트코드를 자바 소스 코드로 변환
- javadoc
- 자동 문서 생성기. 소스 코드의 주석으로 부터 자동을 문서를 생성
- jar
- 압축 툴. 관련있는 클래스 라이브러리들과 리소스들을 하나의 JAR로 묶어줌
'study' 카테고리의 다른 글
[Spring] Scheduling - CronTask (0) | 2021.10.02 |
---|---|
[AWS] AWS에는 무슨 서비스가 있을까? (0) | 2021.07.20 |
내가 만난 CORS 관련 문제 (2) | 2021.06.14 |
[java] 클래스와 인스턴스 (0) | 2021.06.10 |
[JAVA] Optional (0) | 2021.05.15 |