JVM이란
JVM은 Java Virtual Machine의 약자로, 자바 가상머신이라고 부른다. JVM은 운영체제 위에서 동작하는 소프트웨어의 일종으로 자바 프로그램을 운영체제에 상관없이 실행시키도록 도와준다.
JVM 구조
클래스 로더(Class Loader)
JVM에서 동적 로딩(Dynamic Loading)을 담당하는 부분이다.동적 로딩이란, 컴파일 타임이 아닌 런타임에 클래스를 처음 참조할 때 JVM 내로 클래스를 로드 및 링크하여 런타임 데이터 영역(Runtime Data Areas)에 배치하는 작업을 의미한다.
런타임 데이터 영역(Runtime Data Areas)
JVM이 운영체제로부터 할당받은 메모리 영역이다. 총 5가지 영역으로 나누어진다.
이 중 Method Area, Heap은 모든 쓰레드가 공유해서 사용되고, JVM Stack, PC Register, Native Method Stack은 스레드 마다 하나씩 생성된다.
메서드 영역(Method Area)
JVM이 시작될 때 생성된다. 클래스와 인터페이스에 대한 런타임 상수 풀(Runtime Connection pool), 필드와 메서드에 대한 정보, static 변수, 메서드의 바이트 코드 등을 보관한다.
힙(Heap)
동적으로 할당되는 객체와 배열이 저장되는 영역으로, GC(Garbage Collection)의 대상이다.
JVM 스택(JVM Stack)
지역변수와 매개변수, 리턴 값, 연산에 사용되는 임시 값 등이 저장된다.
PC 레지스터(PC Register)
쓰레드가 시작될 때 생성되며 현재 수행 중인 JVM 명령의 주소를 가진다.
네이티브 메서드 스택(Native Method Stack)
자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역이다.
런타임 상수 풀(Runtime Connection pool)
메서드 영역에 포함되는 영역으로 각 클래스와 인터페이스의 상수뿐만 아니라, 메서드와 필드에 대한 모든 레퍼런스까지 담고 있는 테이블이다. 즉, 어떤 메서드나 필드를 참조할 때 JVM은 런타임 상수 풀을 통해 해당 메서드나 필드의 실제 메모리상 주소를 찾아서 참조한다.
실행 엔진(Execution Engine)
런타임 데이터 영역에 배치된 바이트 코드들을 명령어 단위로 읽어서 실행한다. 이때, JVM은 인터프리터 방식과 JIT 컴파일러 방식을 혼합하여 실행한다.
인터프리터
바이트 코드를 한 줄씩 실행한다.
JIT(Just-In-Time) 컴파일러
인터프리터의 단점을 보완하기 위한 컴파일러로, 인터프리터가 반복되는 코드를 발견하면 해당 코드를 바이너리 코드로 컴파일하여 실행한다.
가비지 컬렉터(Garbage Collector)
가비지 컬렉터는 가비지 컬렉션(GC, Garbage Collection)을 통해 메모리 관리 기능을 자동으로 수행한다. 가비지 컬렉션이란 힙 영역에서 사용되지 않는 객체들을 제거하는 작업을 의미한다. 가비지 컬렉션은 참조되지 않는 객체들을 탐색 후 삭제하고, 삭제된 객체의 메모리를 반환하여 힙 메모리를 재사용하는 순서로 작동한다.
자바 컴파일 과정
자바 컴피일 과정을 다음과 같다.
1. 자바 컴파일러(javac)가 자바 소스파일(.java)을 클래스 파일/자바 바이트 코드(.class)로 컴파일한다.
2. 클래스 파일은 클래스 로더에게 전달된다.
3. 클래스 로더는 동적 로딩을 통해 클래스 파일을 런타임 데이터 영역에 배치한다.
4. 실행 엔진은 런타임 데이터 영역에 배치된 클래스 파일을 명령어 단위로 읽어서 실행한다. 즉 바이트 크도를 바이너리
참조
윤성우의 열혈 JAVA 프로그래밍
https://github.com/gyoogle/tech-interview-for-developer/blob/master/Language/%5Bjava%5D%20%EC%9E%90%EB%B0%94%20%EA%B0%80%EC%83%81%20%EB%A8%B8%EC%8B%A0(Java%20Virtual%20Machine).md
https://github.com/gyoogle/tech-interview-for-developer/blob/master/Language/%5Bjava%5D%20%EC%9E%90%EB%B0%94%20%EC%BB%B4%ED%8C%8C%EC%9D%BC%20%EA%B3%BC%EC%A0%95.md
https://github.com/ksundong/backend-interview-question
https://steady-snail.tistory.com/67
https://d2.naver.com/helloworld/1230
'JAVA > Java' 카테고리의 다른 글
[Java] 래퍼 클래스(Wrapper Class) (0) | 2022.09.06 |
---|---|
[Java] Object 클래스 (0) | 2022.09.05 |
[Java] 자바의 예외와 예외처리 (0) | 2022.08.31 |
[Java] 인터페이스와 추상 클래스 (0) | 2022.08.31 |
[Java] 클래스의 상속 (0) | 2022.08.30 |
댓글