목표
자바 소스파일을 JVM으로 실행하는 과정 이해하기
학습할 것
- JVM이란 무엇인가
- 컴파일 하는 방법
- 실행하는 방법
- 바이트코드란 무엇인가
- JIT 컴파일러란 무엇이며 어떻게 동작하는지
- JVM 구성요소
- JDK와 JRE의 차이
JVM
- JVM의미: Java Virtual Machine의 줄임말이며 자바 가상 컴퓨터정도로 이해하면 편하다.
여러 운영체제에서 사용가능한 애뮬레이터이며 자바의 명령을 운영체제에 맞게 변환해준다. - 필요성: 자바는 운영체제에 독립적이다, 그렇기에 여러 운영체제에 사용할려면 운영체제에 종속적인
JVM을 사용해야한다. 사용하게되면 자바의 파일 수정없이 어디서든지 그 파일을 실행해볼수있다.
컴파일과 실행방법
- 컴파일의 의미: 소스프로그램 ⇒ 기계어변환하는 과정(바이트 코드르 만드는 과정)을 말한다.
- java.exe를 사용하여 자바 파일 컴파일하고
javac 소스파일명.java - jdk
진행하면 .class 가 만들어진다. - java.exe 파일을 사용하여 바이트 코드로 컴파일된 .class 실행한다. - jre
※알아두면 좋은 내용
- 클래스를 작정한 자바의 버전과 클래스를 읽는 자바의 버전이 다르면 오류가 뜬다.
저버전에서 쓴 클래스는 저버전부터 고버전까지 읽는데 제한이 없지만 고버전에서 컴파일 한 파일은
저버전에서는 읽히지않는다.(ex. java 17버전에서 컴파일한 파일을 java 8버전에서 실행해보면 오류가 발생한다.)
바이트코드(Byte code)
- JVM이 이해할 수 있도록 변환된 자바 소스코드를 의미한다.
- 변환된 코드의 명령어 크기가 1바이트라서 자바 바이트 코드라 불린다.
JIT 컴파일러
- JIT 컴파일러: 기존 인터프리터 방식의 단점을 보안한 컴파일러이다.
- 작동방식
- 내부적으로 메서드가 호출될때마다 호출 횟수를 카운팅하고 그 횟수가 특정 수치를 넘으면
따로 그 메서드를 캐싱해둔다.
※캐싱: 임시 저장장치에 저장하는것을 의미, 빠르게 데이터를 꺼내올 수 있다.
- 이후 저장된 메서드가 호출될때마다 해석하는것을 방지한다. - 공부하다 보니 문득 궁금한게 생겼다. JVM구성요소를 보면 인터프리터와 JIT 컴파일러가 공존하는것을 볼 수 있다. 기존 인터프리터 방식의 단점을 보안한 컴파일러면 인터프리터가 필요없는것이 아닌가?
답은 x다. 인터프리터는 원래대로 작동하고있다. 단지 다른 쓰레드에서 JIT컴파일러가 자주 사용되는 메소드를
미리 설정해놓고 인터프리터가 그 메소드를 처음부터 안읽도록 작동 시킬 뿐이다.
한마디로 인터프리터의 단점을 보완해주는 장치인것이지 인터프리터의 역할을 통째로 수행하지는 않는다.
※블로그 참고
아래 사이트는 JIT컴파일러를 좀더 자세히 다룬 블로그글이다. JIT컴파일러의 생성 개요 부터 작동방식이 나와있다. 이블로그는 같이 자바를 공부하는 스터디원을 통해서 알았다.
https://aboullaite.me/understanding-jit-compiler-just-in-time-compiler/
JVM 구성요소
구성요소는 크게 4가지로 볼수있다.
- 자바 인터프리터
- 고레벨 언어를 중간코드로 변환하고 이를 각 행마다 실행(그렇기에 컴파일러보다는 느리다.)
- 각 행마다 실행하는 도중 에러가 보고되면 이후 코드는 살펴보지 않기에 보안적인 관점에서는 도움이 됨(추후 코드를 안본다는 점에서ㅇㅇ)
- 클래스 로더
- 자바 바이트 코드(.class)를 메소드 영역에 저장
- 실행중인 런타임에서 JVM과 연결해줌
- 포함되는 정보: 클래스를 비롯한 그의 부모 클래스의 정보, InterFace, Enum 관련 여부, 변수나 메소드 등의 정보가 포함
- 한번에 모든 클래스를 로드하는것이 아닌, 필요한 순간에 해당 클래스 파일을 찾아 메모리에 로딩 해주는 역할
- JIT 컴파일러
- 가비지 컬렉터
- 메모리 관리를 자동으로 해준다.
- 힙의 영역에 객체들이 저장되는데 사용하지 않는 객체들이 있다. 그런 어디서든 참조하고 있지 않은 객체들을 주기적으로 제거하는것이 가비지 컬렉터이다.
- Mark And Sweep방식의 알고리즘을 사용해 청소함
- Mark과정: 그래프 순회를 통해 어떤 객체 참조하고 있는지 찾아서 마킹
- Sweep과정: 참조하고 있지 않는 객체들을 Heap에서 제거
- Compact 과정: Sweep후 분산된 객체를 힙의 시작주소로 모아 메모리 할당
JDK와 JRE
- JDK는 자바로 된 언어를 컴파일하고 개발할 수 있도록 해주는 개발 환경 세트를 의미한다.
- JRE는 자바를 실행 시켜야하는 경우에 필요한 자바 실행 환경이다.
- JDK가 JRE를 포괄하는 개념이다. {JDK = JRE+@(개발에 필요한 도구)} 로 이해하면 쉽다.
- JRE에 JVM과 Class Library포함되어져 있다.
'자바(Java)' 카테고리의 다른 글
[자바] HashSet 중복값 처리 과정, 배열로 변경하는 법 (0) | 2023.08.08 |
---|---|
[자바] 자바 조건문과 반복문, JUnit 5 (0) | 2023.08.05 |
[자바] 자바 연산자 (0) | 2023.07.29 |
[자바] 자바의 프리미티브 타입, 변수, 배열 선언 (0) | 2023.07.24 |
[Java] 자바 StringBuilder 사용법 (0) | 2023.03.19 |