✏️ Info.
- JVM 기본 정리
- JAVA 사용법
📋 List.
1. JVM 이란 무엇인가
2. 컴파일하는 방법
3. 실행하는 방법
4. 바이트 코드란
5. JIT 컴파일러 란, 동작 원리
6. JVM 구성 요소
7. JDK와 JRE 차이
✔️ Content.
1. JVM이란 무엇인가
- Java Byte Code를 OS에 맞게 해석해주어 컴퓨터가 실행시킬 수 있게 하는 주체이다.
- source code를 작성한다 -> .java 파일 생성
- .java 파일을 컴파일(javac) 한다. -> .class 파일 생성
- .class 파일을 OS가 읽을 수 있게 기계어로 변환 시켜준다 -> JVM
2. 컴파일 하는 방법(Java가 설치 되있음을 가정하에 진행)
1). Java Source Code 작성 -> TestClass.java 파일 생성
public static void main(String[] args) throws Exception{
System.out.println("컴파일 하는 방법");
}
2). .java 파일 위치에서 Javac TestClass.java 명령어 입력 -> TestClass.class 파일 생성
javac .\TestClass.java
3. 실행하는 방법
- java [파일명] 명령어 입력(확장자는 입력하지 않는다)
java TestClass
4. 바이트코드란 무엇인가
- 1바이트 크기의 명령 코드 였기에 바이트코드라 불린다.
- 기계어보다 더 추상적인 언어로 위의 Javac로부터 얻어지는 .class파일이다.
- JVM에 의해서 실행되어지는 코드이다.
5. JIT 컴파일러 란, 동작 원리
1). JIT 컴파일러란
- Just In Time
- JRE에 포함되어 잇다.
- 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일 기법
2). 동작 원리
- 같은 코드를 매번 해석하지 않고 실행 할 때 컴파일을 하며 코드를 캐싱한다.
- 이후 바뀐 부분만 컴파일을 하며 나머지는 캐싱된 코드를 가져와 사용한다.
6. JVM 구성 요소
- 크게 Class Loader, Runtime Data Areas, Execution Engine 3가지 영역으로 나뉜다.
1). Class Loader
- .java 파일을 컴파일해서 만든 .class인 파일들을 엮어 Runtime Data Area에 적재하여 프로그램을 구동한다.
- Runtime 시에 일어나는데 클래스에 처음 접근될 때 일어나게 된다.
2). Execution Engine
- Class Loader가 Runtime Data Areas에 불러온 바이트 코드를 실행하는 역할.
- 바이트코드를 실행할 때 기계어로 변경해 명령어 단위로 실행한다.
- 명령어를 하나 씩 실행하는 인터프리터(Interpreter) 방식과 자주 쓰이는 코드를 캐싱해놓고 실행 시점에 사용하는 JIT 방식이 있다.
3). Runtime Data Areas
- OS로부터 할당받은 JVM메모리 영역이다. JAVA App를 실행하는데 필요한 데이터를 담는다.
- Method Area
- 모든 Thread가 공유하는 메모리 영역
- 클래스, 인터페이스 ,메소드 ,필드, Static, Final 등의 ByteCode 등을 보관한다.
- Heap Area
- 프로그램 상에서 런타임시 동적으로 할당하여 사용하는 영역
- class를 이용해 instance를 생성하면 Heap에 저장(new Class())
- Garbage Collection의 대상이 되는 영역이다.
- Stack Area
- Thread마다 별개의 Frame으로 저장된다. - JNI 를 이용해 JVM 내부에 영향을 주지 않기 위함
- PC Register
- Thread가 시작 될 때 생성되며 Thread마다 하나씩 존재
- Thread가 현재 실행하고 있는 부분의 주소를 저장한다.
- OS는 PC Register를 참고하여 CPU 스케줄링 시 해당 Thread가 다음에 어떠한 명령어를 수행해야하는지 알 수 있다.
- Native Method Stack
- Java 외의 언어로 작성된 Native 코드들(C, C++ 등)을 위한 Stack
7. JDK와 JRE의 차이
- JDK
- Java Development Kit
- Java 기반 응용 프로그램을 개발하는데 사용할 수 있는 소프트웨어 번들
- JRE + 개발/디버깅 툴
- JRE
- Java RunTime Enviroment
- Java 프로그램을 실행하는데 필요한 플러그인
- 컴파일된 자바 프로그램을 실행 시킬 수 있는 환경
- JVM + Java 패키지 클래스 + 런타임 라이브러리
❗️ Refer.
- 바이트 코드란 무엇인가 - https://ko.wikipedia.org/wiki/%EB%B0%94%EC%9D%B4%ED%8A%B8%EC%BD%94%EB%93%9C
- JIT 컴파일러란 무엇이며 어떻게 동작하는지 - https://medium.com/@ahn428/java-jit-%EC%BB%B4%ED%8C%8C%EC%9D%BC%EB%9F%AC-c7d068e29f45
- JVM 구성 요소
https://medium.com/@lazysoul/jvm-%EC%9D%B4%EB%9E%80-c142b01571f2
https://velog.io/@litien/JVM-%EA%B5%AC%EC%A1%B0
https://lazymankook.tistory.com/79
- JDK와 JRE의 차이
https://c10106.tistory.com/3135
'Live-Study' 카테고리의 다른 글
[6주차] 상속 (0) | 2021.02.19 |
---|---|
[5주차] 클래스 (0) | 2021.01.04 |
[4주차] 제어문 (0) | 2020.12.31 |
[3주차] 연산자 (0) | 2020.11.23 |
[2주차] 자바 데이터 타입, 변수 그리고 배열 (0) | 2020.11.20 |