JVM 이란 ?
- 어느 OS 어느 환경에서 든지 java를 실행시킬수 있게 해줌.
- bytecode가 JVM위에서 실행되기 때문이다.
- java bytecode를 os가 읽을수 있게 바꿔줌 ( 이 작업은 인터프리터와 JIT컴파일러를 사용)
- 특정 OS별로 네이티브 언어를 바꿔줘야 하기때문에 특정 OS에 종속적이다.
컴파일 하는 방법.
- javac.exe 를 사용하여 컴파일 한다.
실행하는 방법
- java.exe 를 사용하여 클래스파일을 실행시킨다.
바이트코드란 무엇인가 ?
- jvm이 이해할수 있는 상태인 코드
- 이 바이트 코드는 인터프리터와 JIT 컴파일러가 읽을 수 있다.
JIT 컴파일러란 무엇이며 어떻게 동작하는지 ?
-
중복된 바이트코드를 네이티브 언어로 모두 바꿔주는 컴파일러
-
인터프리터가 읽으면서 컴파일시키고 실행하다가 중복되는 부분을 발견하면
-
JIT컴파일러로 보낸다 그럼 JIT 컴파일러가 중복된 바이트코드를 모두 네이티브 언어로 바꿔준다.
JVM 구성요소
- 클래스 로더 시스템 , 메모리 , 실행엔진 , 네이티브 메소드 인터페이스, 네이티브메소드 라이브러리로 나뉘어져 있다.
-
클래스로더 시스템
- 컴파일된 class 파일들을 읽어서 메모리에 적절히 배치시킨다.
-
로딩
-
클래스에서 바이트코드를 읽어오는 과정
-
클래스 로더가 class파일을 읽고 그 내용에 따라 바이너리 데이터를 만들고 메소드 영역에 저장
-
이떄 저장하는 데이터는
- FQCN ( 패키지, 풀 패키지 경로와 클래스 이름 )
- 클래스 , 인터페이스, 이늄 ( 클래스가 어떤 타입인지 저장 )
- 메소드와 변수
-
로딩이 끝나면 해당 클래스 타입의 class 객체를 생성하여 힙 영역에 저장.
-
처음에 bootstrap classloader에서 찾아서 없으면 자식인 platform classloader가 찾고
-
또 없으면 application classloader가 찾아서 없으면 class not found 익센션을 호출
-
bootstrap classloader는 네이티브 코드로 구현되어 있어 JVM마다 구현이 다 다르다.
-
-
링크
- 레퍼런스를 연결하는 과정
- verify , prepare, revolve 3단계로 나뉘어져 있다.
- verify
- .class파일이 유효한지 확인
- 파일이 유효하지 않으면 JVM에러로 종료됨.
- .class파일이 유효한지 확인
- prepare
- static변수와 기본값에 필요한 메모리를 준비하는 과정
- Resolve ( Optional )
- 심볼릭 메모리 레퍼런스를 메소드 영역에 있는 실제 레퍼런스로 교체하는 과정.
- 심볼릭 메모리 레퍼런스란 ?
- 다른 객체를 참조할때 논리적으로만 연결시켜놓고 실제론 연결되어 있지 않음.
- verify
-
초기화
- statc 값들 초기화 및 변수에 할당
-
메모리
- 스택
- JVM 쓰레드가 생길때 해다 쓰레드를 위한 스택도 같이 생긴다.
- 이때 프레임이 스택에 들어가며 이 프레임은 메소드가 호출될때마다 만들어지며
- 메소드의 상태 정보를 저장한다.
- 쓰레드를 종료하면 런타임 스택도 사라진다.
- PC
- 쓰레드마다 쓰레드 내 현재 실행할 스택 프레임을 가리키는 포인터가 생성된다.
- 네이티브 메소드 스택
- 쓰레드 마다 생기는 스택인데 native method가 호출될때 쌓인다.
- JNI를 사용하는 메소드는 여기에 스택이 쌓인다.
- 힙
- 객체를 저장, 공유
- 메소드
- 클래스 수준의 정보를 저장, 공유
- (클래스 이름 , 풀패키지 경로 , 부모 클래스 이름 , 메소드 , 변수)
- 다른 영역에서 참조 가능
- 스택
-
실행 엔진
- 인터프리터
- 바이트코드를 한줄마다 읽음과 동시에 네이티브 코드로 변경시키면서 실행시킴.
- JIT 컴파일러
- 인터프리터가 반복되는 코드를 찾으면 JIT 컴파일러로 보내서 JIT 컴파일러가 반복되는 코드를 모두 네이티브 코드로 바꿔둔다.
- 그러면 인터프리터는 네이티브 코드를 바로 실행시킨다.
- GC
- 더이상 참조되지 않은 객체를 메모리에서 해제시킨다.
- 인터프리터
-
네이티브 메소드 인터페이스
- 자바에서 C나 C++된 함수를 사용할수 있는 방법을 제공하는 인터페이스
-
네이티브 메소드 라이브러리
- C , C++로 작성된 라이브러리
JDK와 JRE의 차이
-
JRE는 단순히 자바를 실행할수 있게만 해줌
- JVM과 라이브러리들이 포함.
- 자바 런타임 환경에서 사용되는 프로퍼티 세팅이나 리소스 파일을 가지고 있다.
-
JDK는 JRE와 개발툴들이 같이 포함되어 있음.
출처
'백선생님 온라인스터디' 카테고리의 다른 글
6주차 상속 (0) | 2021.01.10 |
---|---|
4주차 - 제어문 (0) | 2021.01.09 |
3주차 연산자 (0) | 2021.01.07 |
연산자 (0) | 2020.11.28 |
스터디 2주차 - 자바 데이터타입, 변수 그리고 배열 (0) | 2020.11.21 |