일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 자바
- kotlin
- SW봉사
- 파이썬
- CJ UNIT
- softeer
- 스프링
- 회고
- BFS
- 데이터베이스
- 시나공
- MYSQL
- python
- 문제풀이
- java
- C++
- SQL
- 1과목
- 정보처리산업기사
- 코딩교육봉사
- 소프티어
- 공부일지
- 프로그래머스
- 알고리즘
- 코딩봉사
- programmers
- 백준알고리즘
- 백준 알고리즘
- 코틀린
- 백준
- Today
- Total
JIE0025
[WhiteShip][1주차] JVM과 자바코드 본문
Codestates BE 42 : Study, Commercise 01 Java
혼자 정리했습니다 :)
1주차 : JVM과 자바코드
목차
JVM이란 무엇인가
컴파일 하는 방법
실행하는 방법
바이트코드란 무엇인가
JIT 컴파일러란 무엇이며 어떻게 동작하는지
JVM 구성요소
JDK와 JRE의 차이
JVM이란 무엇인가
✅ JVM (Java Virtual Machine)
운영체제와 자바 바이트코드 사이에서
자바 바이트코드를 해석해
모든 운영체제 사이에서 동일하게 동작하도록 하는 가상머신
- OS별로 각각 제공되는 JVM이 자바 바이트 코드를 기계어로 해석해 동작하도록 함
즉 자바는 OS에 상관없이 JVM만 설치되어 있으면,
동일한 코드로 동일한 동작을 할 수 있다.
* 기존의 다른 언어 (C,C++)는 운영체제에서 동작하기 때문에 의존적임
컴파일 하는 방법
실행하는 방법
⏺ 애플리케이션 실행 과정
1) 콘솔에 Hello World!를 출력하는 자바 코드가 있다.
2) 해당 프로그램을 실행하기 위해 자바 컴파일러가 컴파일이라는 작업을 한다.
3) .java파일이 컴파일을 거쳐 .class파일로 변경이 되고 이는 바이트 코드가 된다.
4) 인터프리터가 바이트코드를 해석하며 애플리케이션이 실행된다.
단어해석
* 컴파일 : 사람이 이해하는 언어를 컴퓨터가 이해할 수 있는 언어로 바꿔주는 과정 (원시코드-> 목적코드)
* 컴파일러 : 번역기/ 해석기 - 고레벨언어를 저레벨언어로 해석해주는 번역 프로그램 --- javac
* 인터프리터 : 한줄씩 해석해 기계어로 번역 프로그램
⏺ 왜 자바는 컴파일러와 인터프리터를 둘다 가지는가? (WHY)
일반적인 언어는 컴파일러 / 인터프리터 중 한개만 사용해서 번역을 하는데, 왜 자바는 두개의 번역기를 갖고 있는걸까?
- 원래는 자바 JVM에서 인터프리터 방식만 사용했었음
- 성능의 문제가 발생함
- JIT Compiler를 추가해 성능의 효율을 올림
추가 학습
* 링크 : 목적코드를 최종 실행 가능한 실행파일 (.exe)을 만들기 위해 연결하는 작업
* 링커 : 링크를 실행해주는 프로그램
⏺ 실습
1) 테스트 코드 작성
Hello.java
class Hello{
public static void main(String[] args){
System.out.println("Hello Java 221029");
}
}
2) . java 파일이 존재하는 곳에서 javac Hello.java 명령어 입력
잘된건진 모르겠지만 일단 못알아먹겠다.
3) javap -c Hello.class 를 입력해서 해석된 바이트 코드를 볼 수 있다.
4) java Hello 를 입력해서 컴파일한 .class를 실행할 수 있다.
>> Hello Java 221029
바이트코드란 무엇인가
✅ 자바 바이트 코드 (Java Bytecode)
JVM이 이해할 수 있는 언어로 변환된 자바 소스코드
자바 컴파일러에 의해 변환된 코드의 명령어 크기가 1byte이기 때문에 바이트코드라고 불린다.
바이트 코드는 다시 실시간 번역기 / JIT 컴파일러에 의해 바이너리 코드로 변환된다.
*바이너리코드 (이진코드) : 컴퓨터가 인식할 수 있는 0과 1로 구성된 이진 코드
가상머신이 이해하는 코드 : 바이트코드
CPU가 이해하는 코드 : 바이너리코드
JIT 컴파일러란 무엇이며 어떻게 동작하는지
✅ JIT 컴파일러
프로그램을 실제 실행하는 시점에 기계어로 변환하는 컴파일러
정의만 봐서는 잘 모르겠으니 아래 내용을 보며 이해해보자.
⏺ 왜 JIT 컴파일러를 사용할까? (WHY)
위에서 자바는 컴파일러와 인터프리터를 모두 갖고 있다고 말했다. (이 방식에는 문제가 있었다.)
문제 : 매번 컴파일을 통해 Java파일을 Bytecode(.class)로 변환하고, 다시 인터프리터를 통해 한줄한줄 기계어로 변환하는 작업이 속도면에서 비효율적이다.
해결 : JIT컴파일러를 사용해서 속도를 개선
먼저 JIT컴파일러가 소스코드 전체를 확인 후 중복된 부분을 미리 기계어로 번역시켜서 저장한다.
이후 인터프리터 방식으로 번역하다가 중복된 부분을 만났을 때 이미 변환된 기계어 코드를 재사용하며 속도를 개선했다.
볼만한 자료 :https://youtu.be/8y0L9QT7U74
💥 해당 과정을 수행하기 위해 초반에 메모리를 잡아두는 등의 선행 작업들이 있어 초기 실행 속도가 다소 느릴 수 있다. 그 이후 바이트 코드를 사용할 때마다 기계어로의 변환 작업이 덜 들어 속도의 개선이 일어난다. (일반적)
💥 중복된 코드가 거의 없어 코드가 재사용될 일이 없거나, 규모가 작은 프로그램에선 초기 실행 속도에 의해 배보다 배꼽이 더 클 수 있다.
JVM 구성요소
✅ JVM 구성요소
- 클래스 로더 (Class Loader)
- 실행 엔진 (Execution Engine)
- 인터프리터 (Interpreter)
- JIT 컴파일러 (Just-in Time Compiler)
- 가비지 컬렉터 (Garbage Collector)
- 런타임 데이터 영역(Runtime Data Area)
- Method Area
- Heap Area
- Stack Area
- PC Register
- Native Method Stack
⏺ 클래스 로더 (Class Loader)
바이트 코드 .class파일을 런타임시에 동적으로 로드 함
- 읽은 바이트코드를 Runtime Data Area에 배치시키는 역할
⏺ 실행 엔진 (Execution Engine)
클래스 로더가 JVM내 Runtime Data Area에 배치시킨 바이트코드를 실행시킨다.
1) 인터프리터 (Interpreter)
바이트 코드를 기계어 코드로 해석해 한줄씩 실행 함
2) JIT 컴파일러 (Just-in Time Compiler)
인터프리터의 느린 실행 속도를 보완하고, 성능을 향상시킨 컴파일러
그 순간 컴파일 되기 때문에 반복되는 코드를 컴파일 해서 사용한다.
3) 가비지 컬렉터 (Garbage Collector) -- 이름 그대로를 해석하면 쓰레기 수집가..
메모리를 자동으로 관리하는 자바 프로그램이다.
- 데몬 스레드에서 항상 백그라운드로 실행된다.
- 기본적으로 Heap영역의 메모리를 JVM이 판단하여,
더이상 사용되지 않는 인스턴스를 찾아 메모리에서 삭제한다.
⏺ 런타임 데이터 영역 (Runtime Data Area)
프로그램을 수행하기 위해, JVM이OS에서 할당받은 메모리 공간/영역
- Method Area
- 클래스 멤버 변수의 이름, 데이터 타입, 리턴 타입, 상수풀, static 변수 등이 저장
- 클래스 수준의 정보가 저장
- Heap Area
- new 연산자로 생성된 객체, 배열이 저장 됨
- Stack Area
- 스레드가 생성될 때마다 생성되는 영역
- 지역변수 저장
- 메소드를 호출할 때마다 스택이 개별적으로 생성됨 -> 동시성 문제 해결하기 위해 메소드에 동기화 블럭을 지정 함.
- PC Registers
- 쓰레드가 생성될 때마다 생성되는 영역
- Prigram Counter - 현재 스레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역
- Native Method Stack
- 자바 프로그램이 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역
- 자바 언어 이외의 언어로 작성된 코드를 저장하는 메모리영역
- 주로 native키워드가 붙은 것들이 저장 됨.
JDK와 JRE의 차이
✅ JDK
Java Development Kit : 자바 개발 키트
자바를 사용하기 위해 필요한 모든 기능을 갖춘 Java용 SDK (Software Development Kit)
* SDK : HW플랫폼, OS, 프로그래밍 언어 제작사가 제공하는 툴
- JDK는 JRE를 포함하고 있음
- 컴파일러(javac), jdb, javadoc 과 같은 도구들도 있음
⏩ JDK는 프로그램을 생성, 실행, 컴파일 할 수 있다.
⏩ JRE와 JVM을 모두 포함하는 포괄적 키트
✅ JRE
Java Runtime Environment : 자바 런타임 환경
컴파일된 Java 프로그램을 실행하는데 필요한 패키지
- JVM + 자바 클래스 라이브러리 등으로 구성
⏩ 자바프로그램을 실행 가능하게 하는 도구
⏩ JVM을 포함하고 있음
References
- https://dkswnkk.tistory.com/416
- https://kingofbackend.tistory.com/123
- https://logical-code.tistory.com/149
- https://doozi0316.tistory.com/entry/1%EC%A3%BC%EC%B0%A8-JVM%EC%9D%80-%EB%AC%B4%EC%97%87%EC%9D%B4%EB%A9%B0-%EC%9E%90%EB%B0%94-%EC%BD%94%EB%93%9C%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%8B%A4%ED%96%89%ED%95%98%EB%8A%94-%EA%B2%83%EC%9D%B8%EA%B0%80
- https://moon-seung-chan.tistory.com/45
'개발 > Java, Kotlin' 카테고리의 다른 글
[WhiteShip][7주차] 패키지 (0) | 2022.11.08 |
---|---|
[WhiteShip][3주차] 연산자 (0) | 2022.11.03 |
[WhiteShip][2주차] 자바 데이터 타입, 변수 그리고 배열 (0) | 2022.11.02 |
[Spring Framework] 기초공부 (0) | 2020.02.03 |
Windows에 JAVA(자바) JDK 1.8 설치와 환경변수 설정 (0) | 2020.01.22 |