우선 강의 내용 JVM과 자바의 정석 앞부분 JVM만 보고 정리를 한 내용이다!
자바 5주차까지 강의를 다 듣고 난 이후 자바의 정석 JVM 상세한 부분보고 내용 추가할 예정!!
JVM이란 무엇인가?
'Java virtual machine'을 줄인 것으로, '자바를 실행하기 위한 가상 컴퓨터 or 가상 기계'라고 이해하면 된다.
여기서 가상 컴퓨터랑 가상 기계의 차이점은 뭘까?
- 가상 기계(virtual machine) : 소프트웨어로 구현된 하드웨어를 뜻하는 넓은 의미
- 가상 컴퓨터(virtual computer) : 실제 컴퓨터(하드웨어)가 아닌 소프트웨어로 구현된 컴퓨터
- 컴퓨터 속의 컴퓨터라고 생각하면 편하다.
java로 작성된 애플리케이션은 무조건 이 가상 컴퓨터(jvm)에서만 실행이 된다, 그러므로 자바 애플리케이션이 실행되기 위해서는 반드시 JVM이 필요하다.
이 이미지를 보자, 오른쪽의 예시는 일반 애플리케이션의 예시이다.
일반 애플리케이션의 코드는 OS만 거치고 바로 하드웨어로 전달하는데, 자바 애플리케이션은 JVM을 한번 더 거치게 된다.
이 과정에서 하드웨어에 맞게 완전 컴파일된 상태가 아니고 실행 시 해석(interpret)되기 때문에 속도가 느려진다.
그러나 요즘엔 바이트코드(컴파일된 자바코드)를 하드웨어의 기계어로 바로 변환해주는 JIT컴파일러와 최적화 기술이 적용되어 속도의 격차가 줄어들었다.
그럼 왜 JVM을 쓰는가? 에 대해 생각해보자.
위의 사진을보면 일반 애플리케이션은 OS와 바로 맞닿아있다, 그렇기 때문에 OS에 종속적이게 된다, 종속적이게 된다면 다른 OS에서 실행시키기 위해서는 애플리케이션을 그 OS에 맞게 변경해야한다는 단점이 생긴다.
그에 비해 자바 애플리케이션은 JVM하고만 상호작용을 하기때문에 OS에 독립적이라 다른 OS에서도 프로그램의 변경없이 실행이 가능하다.
단, 자바 애플리케이션은 OS에 독립적이지만, JVM은 OS에 종속적이다(이미지 참조) 그러므로 해당 OS에서 실행가능한 JVM이 필요하게 된다.(window, linux, mac 등)
일반적으로 많이 사용되는 주요 OS용 JVM을 제공하고있기 때문에, 사용자 OS에 해당하는 JVM을 사용만한다면 자바 애플리케이션은 어디서든 실행이 된다.
JVM 관련 용어정리
1. 바이트 코드
- java 프로그램 변환 코드
- 내가 작성한 코드가 운영체제가 읽을 수 있는 코드(바이트 코드)로 JAVA 컴파일러가 변환한 코드
- java 컴파일러 : 내가 작성한 java(.java파일)을 바이트 코드(.class파일)로 변환하는 변환기
2. 인터프리터(interpret)
- java .class 코드 해석기
- OS가 읽은 바이트 코드를 기기(기계)가 실행 할 수 있는 기계어로 번역
3. JIT 컴파일러
- 빠른 java .class 코드 해석기
- 인터프리터의 효율을 높여주는 서포터 해석기
4. 메모리 영역
- java 데이터를 저장하는 영역
- 운영체제로부터 JVM이 할당받은 메모리 영역
5. 클래스 로더
- java .class 바이트 코드를 메모리 영역에 담는 운반기
- JVM으로 class(바이트코드)를 불러와서 메모리에 저장
6. 가비지 컬렉터(중요!)
- 메모리 영역에서 안쓰는 데이터를 주기적으로 흡수
- 따로 포스팅(https://geniebox.tistory.com/136)
JRE, JDK는 무엇인가?
JVM이 나오고 나면, 항상 같이 나오는 JRE와 JDK에 대해 알아보자
JRE란 무엇인가?
JRE란 간단하게 말하면 자바실행환경(Java Runtime Environment) 즉, '자바로 작성된 응용프로그램이 실행되기 위한 최소환경'이다.
JRE는 결국 JVM + 클래스 라이브러리(Java API)라고 생각하면 된다.
JDK는 무엇인가?
JRE는 간단하게 정리가 된다, 그렇다면 JDK는 무엇인가?
JDK는 자바개발도구(Java Development Kit) 즉, 자바 개발 키트라고 생각하면된다.
JDK는 JRE(JVM), 개발에 필요한 실행파일(javac.exe 등)을 포함하고, 코드를 디버깅하는 jdb등의 기능도 있다.
여기서 디버깅이란 코드의 중단점을 찍을 수 있는데(아래 이미지 참조)
중단점을 찍게되면 이런식으로 빨간줄로 변한다.
디버깅은 중단점 일시정지 + 코드 라인 단위 수행이라고 생각하면 편하다.
디버깅 관련해서는 나중에 따로 자세히 포스팅을 할 예정이다!
'❤️ JAVA > Basic' 카테고리의 다른 글
[JAVA] 객체 지향 프로그래밍(OOP)과 클래스 (2) | 2024.10.15 |
---|---|
[JAVA] JAVA 2주차(컬렉션) (0) | 2024.10.10 |
[JAVA] JAVA 2주차(배열) (0) | 2024.10.10 |
[JAVA] JAVA 2주차(연산자,조건문,반복문) (2) | 2024.10.10 |
[JAVA] JAVA 1주차 (0) | 2024.10.08 |