1부. JVM 이 해 하 기
- 자 바, JVM, JDK, JRE
JVM (Java Virtual Machine)
- 자 바 가 상 머 신 으 로 자 바 바 이 트 코 드(.class 파 일)를 O S에 특 화 된 코 드 로 변 환(인 터 프 리 터 와 JIT 컴 파 일 러)하 여 실 행 한 다.
- 바 이 트 코 드 를 실 행 하 는 표 준(JVM 자 체 는 표 준)이 자 구 현 체(특 정 밴 더 가 구 현 한 JVM)다.
- JVM 스 팩: h ttps://docs.oracle.com/javase/specs/jvms/se11/html/
- JVM 밴 더: 오 라 클, 아 마 존, Azul, ...
- 특 정 플 랫 폼 에 종 속 적.
JRE (Java Runtime Environment): JVM + 라 이 브 러 리
- 자 바 애 플 리 케 이 션 을 실 행 할 수 있 도 록 구 성 된 배 포 판.
- JVM과 핵 심 라 이 브 러 리 및 자 바 런 타 임 환 경 에 서 사 용 하 는 프 로 퍼 티 세 팅 이 나 리 소 스 파 일 을 가 지 고 있 다.
- 개 발 관 련 도 구 는 포 함 하 지 않 는 다. (그 건 J DK에 서 제 공)
JDK (Java Development Kit): JRE + 개 발 툴
- JRE + 개 발 에 필 요 할 툴
- 소 스 코 드 를 작 성 할 때 사 용 하 는 자 바 언 어 는 플 랫 폼 에 독 립 적.
- 오 라 클 은 자 바 11부 터 는 JDK만 제 공 하 며 JRE를 따 로 제 공 하 지 않 는 다.
- Write Once Run Anywhere
자 바
- 프 로 그 래 밍 언 어
- JDK에 들 어 있 는 자 바 컴 파 일 러(javac)를 사 용 하 여 바 이 트 코 드(.class 파 일)로 컴 파 일 할 수 있 다.
- 자 바 유 료 화? 오 라 클 에 서 만 든 Oracle JDK 11 버 전 부 터 상 용 으 로 사 용 할 때 유 료.
- https://medium.com/@javachampions/java-is-still-free-c02aef8c9e04
JVM 언 어
- JVM 기 반 으 로 동 작 하 는 프 로 그 래 밍 언 어
- 클 로 저, 그 루 비, JRuby, Jython, Kotlin, Scala, ...
참 고
- JIT 컴 파 일 러: h ttps://aboullaite.me/understanding-jit-compiler-just-in-time-compiler/
- JDK, JRE 그 리 고 JVM: h ttps://howtodoinjava.com/java/basics/jdk-jre-jvm/
- https://en.wikipedia.org/wiki/List_of_JVM_languages
2. JVM 구 조
클 래 스 로 더 시 스 템
- .class 에 서 바 이 트 코 드 를 읽 고 메 모 리 에 저 장
- 로 딩: 클 래 스 읽 어 오 는 과 정
- 링 크: 레 퍼 런 스 를 연 결 하 는 과 정
- 초 기 화: static 값 들 초 기 화 및 변 수 에 할 당
메 모 리
- 메 모 스 영 역 에 는 클 래 스 수 준 의 정 보 (클 래 스 이 름, 부 모 클 래 스 이 름, 메 소 드, 변 수) 저 장. 공 유 자 원 이 다.
- 힙 영 역 에 는 객 체 를 저 장. 공 유 자 원 이 다.
- 스 택 영 역 에 는 쓰 레 드 마 다 런 타 임 스 택 을 만 들 고, 그 안 에 메 소 드 호 출 을 스 택 프 레 임 이 라 부 르 는 블 럭 으 로 쌓 는 다. 쓰 레 드 종 료 하 면 런 타 임 스 택 도 사 라 진 다.
- PC(Program Counter) 레 지 스 터: 쓰 레 드 마 다 쓰 레 드 내 현 재 실 행 할 스 택 프 레 임 을 가 리 키 는 포 인 터 가 생 성 된 다.
- 네 이 티 브 메 소 드 스 택
- https://javapapers.com/core-java/java-jvm-run-time-data-areas/#Program_Counter_PC_ Register
실 행 엔 진
- 인 터 프 리 터: 바 이 크 코 드 를 한 줄 씩 실 행.
- JIT 컴 파 일 러: 인 터 프 리 터 효 율 을 높 이 기 위 해, 인 터 프 리 터 가 반 복 되 는 코 드 를 발 견 하 면 JIT 컴 파 일 러 로 반 복 되 는 코 드 를 모 두 네 이 티 브 코 드 로 바 꿔 둔 다. 그 다 음 부 터 인 터 프 리 터 는 네 이 티 브 코 드 로 컴 파 일 된 코 드 를 바 로 사 용 한 다.
- GC(Garbage Collector): 더 이 상 참 조 되 지 않 는 객 체 를 모 아 서 정 리 한 다. JNI(Java Native Interface)
- 자 바 애 플 리 케 이 션 에 서 C, C++, 어 셈 블 리 로 작 성 된 함 수 를 사 용 할 수 있 는 방 법 제 공
- Native 키 워 드 를 사 용 한 메 소 드 호 출
- https://medium.com/@bschlining/a-simple-java-native-interface-jni-example-in-java-and- scala-68fdafe76f5f
네 이 티 브 메 소 드 라 이 브 러 리
- C, C++로 작 성 된 라 이 브 러 리
참 고
- https://www.geeksforgeeks.org/jvm-works-jvm-architecture/
- https://dzone.com/articles/jvm-architecture-explained
- http://blog.jamesdbloom.com/JVMInternals.html
3. 클 래 스 로 더
클 래 스 로 더
- 로 딩, 링 크, 초 기 화 순 으 로 진 행 된 다.
로 딩
- 클 래 스 로 더 가 .class 파 일 을 읽 고 그 내 용 에 따 라 적 절 한 바 이 너 리 데 이 터 를 만 들 고 “메 소 드” 영 역 에 저 장.
- 이 때 메 소 드 영 역 에 저 장 하 는 데 이 터
- FQCN
- 클 래 스 | 인 터 페 이 스 | 이 늄
- 메 소 드 와 변 수
- 로 딩 이 끝 나 면 해 당 클 래 스 타 입 의 Class 객 체 를 생 성 하 여 “ 힙" 영 역 에 저 장.
링 크
- Verify, Prepare, Reolve(optional) 세 단 계 로 나 눠 져 있 다.
- 검 증: .class 파 일 형 식 이 유 효 한 지 체 크 한 다.
- Preparation: 클 래 스 변 수(static 변 수)와 기 본 값 에 필 요 한 메 모 리
- Resolve: 심 볼 릭 메 모 리 레 퍼 런 스 를 메 소 드 영 역 에 있 는 실 제 레 퍼 런 스 로 교 체 한 다.
초 기 화
- Static 변 수 의 값 을 할 당 한 다. (static 블 럭 이 있 다 면 이 때 실 행 된 다.)
- 클 래 스 로 더 는 계 층 구 조 로 이 뤄 져 있 으 면 기 본 적 으 로 세 가 지 클 래 스 로 더 가 제 공 된 다.
- 부 트 스 트 랩 클 래 스 로 더 - J AVA_HOME\lib에 있 는 코 어 자 바 A PI를 제 공 한 다. 최 상 위 우 선 순 위 를 가 진 클 래 스 로 더
- 플 랫 폼 클 래 스 로 더 - JAVA_HOME\lib\ext 폴 더 또 는 java.ext.dirs 시 스 템 변 수 에 해 당 하 는 위 치 에 있 는 클 래 스 를 읽 는 다.
- 애 플 리 케 이 션 클 래 스 로 더 - 애 플 리 케 이 션 클 래 스 패 스(애 플 리 케 이 션 실 행 할 때 주 는 -classpath 옵 션 또 는 java.class.path 환 경 변 수 의 값 에 해 당 하 는 위 치)에 서 클 래 스 를 읽 는 다.
4. 리 플 렉 션 API 1 클 래 스 정 보 조 회
- https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html Class에 접 근 하 는 방 법
- 모 든 클 래 스 를 로 딩 한 다 음 Class의 인 스 턴 스 가 생 긴 다. “타 입.class”로 접 근 할 수 있 다.
- 모 든 인 스 턴 스 는 getClass() 메 소 드 를 가 지 고 있 다. “인 스 턴 스.getClass()”로 접 근 할 수 있 다.
- 클 래 스 를 문 자 열 로 읽 어 오 는 방 법
- Class.forName(“FQCN”)
- 클 래 스 패 스 에 해 당 클 래 스 가 없 다 면 ClassNotFoundException이 발 생 한 다.
Class를 통 해 할 수 있 는 것
- 필 드 (목 록) 가 져 오 기
- 메 소 드 (목 록) 가 져 오 기
- 상 위 클 래 스 가 져 오 기
- 인 터 페 이 스 (목 록) 가 져 오 기
- 애 노 테 이 션 가 져 오 기
- 생 성 자 가 져 오 기
- ...